獲取窗體的句柄
FindWindow,用來根據類名和窗口名來得到窗口句柄。但是這個函數不能查找子窗口,也不區分大小寫。如果要從一個窗口的子窗口中查找需要使用的FindWindowEX。
1.在C#中使用方法如下:
[DllImport("User32.dll",EntryPoint="FindWindow")]
private static extern IntPtr FindWindow(string lpClassName,string lpWindowName);
IntPtr hWnd = FindWindow(null,"計算器");
//其中第一個參數為該窗體的類名,其實一般來說都設置為null
//第二個參數為窗體的標題名(一般第二個參數經常使用)
獲取窗體的子窗體句柄
FindWindowEx該函數獲得一個窗口的句柄,該窗口的類名和窗口名與給定的字符串相匹配。這個函數查找子窗口,從排在給定的子窗口后邊的子窗口開始。在查找時不區分大小寫。
HWND FindWindowEx(HWND hwndParent,HWND hwndChildAfter,LPCTSTR lpszClass,LPCTSTR lpszWindow);
參數
hwndParent:要查找子窗口的父窗口句柄。如果hwnjParent為NULL,則函數桌面窗口為父窗口,查找桌面窗口的所有子窗口。Windows NT5.0 and
later:如果hwndParent是HWND_MESSAGE,函數僅查找所有消息窗口。
hwndChildAfter:子窗口句柄。查找從在Z序中的下一個子窗口開始。子窗口必須為hwndPareRt窗口的直接子窗口而非后代子窗口。如果HwndChildAfter為NULL,查找從hwndParent的第一個子窗口開始。如果hwndParent和hwndChildAfter同時為NULL,查找從hwndParent的第一個子窗口開始。如果hwndParent和hwndChildAfter同時為NULL,則函數查找所有的頂層窗口及消息窗口。(使用VS的自帶的spy++ 則如下圖)
lpszClass,指向一個指定了類名的空結束字符串,或一個標識類名字符串的成員的指針。如果該參數為一個成員,則它必須為前次調用theGloalAddAtom函數產生的全局成員。該成員為16位,必須位於lpClassName的低16位,高位必須為0。
lpszWindow:指向一個指定了窗口(窗口標題)的空結束字符串。如果該參數為NULL,則為所有窗口全匹配。返回值:如果該參數為NULL,則為所有窗口全匹配。返回值:如果函數成功,返回值為具有指定類名和窗口名的窗口句柄。如果函數失敗,返回值為NULL。
若想獲得更多錯誤信息,請調用GetLastError函數。
//在程序中的使用如下
[DllImport("user32.dll",EntryPoint="FindWindowEx")]
private static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow)
const int BM_CLICK = 0xF5;
IntPtr mainHwnd = FindWindow(null,"用戶登錄");
if(mainHwnd != IntPtr.Zero){
IntPtr childHwnd = FindWindowEx(mainHwnd,IntPtr.Zero,null,"登錄");
if(childHwnd != IntPtr.Zero){
SendMessage(childHwnd,BM_Click,0,0);
}else{
MessageBox.Show("沒有找到窗口");
}
}
特殊的方法
在有些時候獲取的控件沒有標題,就不能通過FindWindEx()獲取對應的空間。為了解決上述問題則需要通過其他的方法進行解決。
WindowFromPoint
函數功能:該函數獲得包含指定點的窗口的句柄,Point參數指屏幕坐標
參數
Point:指定一個被檢測的點的POINT結構。
返回值
返回值為包含該點的窗口句柄。如果不存在窗口包含這個點,則返回Null。如果窗口無效或者隱藏,則返回Null。通過測試,發現獲取部分控件句柄,返回的都是父窗口的句柄。包含Static Text, GroupBox等等。
[DllImport("user32.dll", EntryPoint = "WIndowFromPoint")]//指定坐標處窗體句柄
public static extern in WindowFromPoint(int xPoint, int yPoint);