天天看點

WIN32 API擷取視窗句柄

WIN32 API擷取視窗句柄

2008-08-13 05:28 P.M.

關于如何擷取視窗句柄,以及有哪些函數可供使用的簡單讨論!

首先羅列出一些擷取句柄的win32 api 函數,然後簡單說說他們的用途!最後說說是怎麼了解和應用的。

可用的win32 api函數:

1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)

    HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)

2.HWND WindowFromPoint(POINT& Point)

3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)

   BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)

   BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)

   BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)

一般用途:

        對于第一種,大家都很熟悉,是捕捉句柄的正常武器,FindWindow這兩兄弟,可以接受捕捉對象的類名或者視窗标題之一,作為參數,傳回一個 HWND。可是對于一般群衆,不一定知道所有的視窗(包括标題欄、按鈕等等)的類名啊!——可以簡單舉例,請問你知道桌面圖示的視窗的類名嗎?而對于視窗 标題,有可能會出現相同的标題,有兩個視窗——指一個程式的兩個程序,這又是個麻煩吧!好了,這個問題先放放,繼續下一組。

       第二組,通過win32定義的POINT結構(typedef struct tagPOINT {   LONG x;

LONG y;} POINT),來獲得目前滑鼠光标位置的視窗HWND,這是最直覺的武器!正常操作如下:先得到Cursor的POINT(BOOL GetCursorPos(LPPOINT)函數),再用WindowFromPoint。這樣,我們幾乎可以獲得任何打開的有視窗的函數的HWND了! 然後通過擷取類名的win32 api函數(int GetClassName( HWND hWnd,   LPTSTR lpClassName,   int nMaxCount ))得到類名——這裡的lpClassName最好用字元數組位址,nMaxCount就是數組的size了,同時,這種方法解決了第一個問題的麻煩!——我可以把滑鼠放在任何地方!*^_^*

       第三組,這些是用來列舉和處理任何視窗的超級武器!通過組合運用EnumWindows和EnumWindowsProc,EnumChildWindows與EnumChildProc,可以掃描桌面所有視窗并對之處理!

我的了解

任務:得到所有的視窗的類名。

解決辦法1:我們會先想到第三組,可以自桌面視窗開始(它是所有視窗的祖先),依次掃描,擷取類名并存之。有點兒像Visual Stdio的Spy++,或者Borland 的WinSight32,具體辦法如下:(bcb中)

在主程式中,調用EnumWindows,傳入 YouEnumProc的函數位址作第一個參數,别忘了轉換成WNDENUMPROC類型。第二參可 NULL。::EnumWindows(reinterpret_cast<WNDENUMPROC> YouEnumProc,NULL);

在YouEnumProc函數中,如果第一參HWND = = NULL,就跳離(return FALSE;),可以結束啦!

然後,把類名數組準備好,得到類名,存之。

傳回真值,繼續下一次掃描。

看起來并不複雜,是一種函數遞歸。但是我可會解釋!面啊!: p

第二種解決方法:簡單、直覺——自己想出來的,頗得意

首先準備一個時鐘,一種存類名方法(我用TMemo)

在定時器處理函數中:

1、得到目前cursor的點位置

2、再用WindowFromPoint,

3、然後得到類名,放到TMemo裡

第三種方法:其實利用FindWindow和循環結構也應該可以。

繼續閱讀