C# 獲取窗體的句柄和獲取窗體中的空間


獲取窗體的句柄

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);
    

ChildWindowFromPoint(HWND hWndParent, POINT Point);

功能:返回包含這個點的窗口句柄,即使窗口隱藏或者處於無效狀態。(需要指定某個容器窗體,返回該容器窗體中包含點的窗口句柄)

返回值:如果點不在父窗口內,則返回Null,如果點在父窗口,但不在任何子窗口上,則返回父窗口的句柄。

另外,特別要注意的是:參數Point不是屏幕坐標,而是相對容器窗口的坐標。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM