| 導購 | 订阅 | 在线投稿
分享
 
 
 

win32 API窗口句柄的獲得——我的經驗

來源:互聯網網民  2006-12-17 07:42:56  評論

win32 API窗口句柄的獲得——我的經驗

win32 API窗口句柄的獲得——我的經驗 初次寫文檔,文筆不通暢的地方,以及理解錯誤之處望各位朋友多多指正!

這篇文章是關于如何獲取窗口句柄,以及有哪些函數可供使用的簡單討論!可適用于vc、bcb(其他的我沒有試,估計可以),本人在bcb環境下試驗。

首先我會羅列出一些獲取句柄的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,可以掃描桌面所有窗口並對之處理!

我的理解:(這部分用任務驅動式教學方法——誰讓小弟是老師呢!xi xi)

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

解決辦法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和循環結構也應該可以

總結:其實得到HWND的方法很多,比如知道了窗口層次,依次向下掃。。。在說第三種呢!但我覺得,我的方法最直接有效,你說呢?

歡迎大家與我聯系,並討論這個問題!有關這個問題我還有許多疑問,比如HWND與ID的轉換,在如IE頁面中的表單控件的HWND或ID,還是其他的東東,總之是能識別他的東西。。。這個我很困惑,沒辦法!

不清楚地方,大家要參照MSDN啊!(好東西呀!)

 
特别声明:以上内容(如有图片或视频亦包括在内)为网络用户发布,本站仅提供信息存储服务。
 
win32 API窗口句柄的獲得——我的經驗 win32 API窗口句柄的獲得——我的經驗 初次寫文檔,文筆不通暢的地方,以及理解錯誤之處望各位朋友多多指正! 這篇文章是關于如何獲取窗口句柄,以及有哪些函數可供使用的簡單討論!可適用于vc、bcb(其他的我沒有試,估計可以),本人在bcb環境下試驗。 首先我會羅列出一些獲取句柄的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,可以掃描桌面所有窗口並對之處理! 我的理解:(這部分用任務驅動式教學方法——誰讓小弟是老師呢!xi xi) 任務:得到所有的窗口的類名。 解決辦法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和循環結構也應該可以 總結:其實得到HWND的方法很多,比如知道了窗口層次,依次向下掃。。。在說第三種呢!但我覺得,我的方法最直接有效,你說呢? 歡迎大家與我聯系,並討論這個問題!有關這個問題我還有許多疑問,比如HWND與ID的轉換,在如IE頁面中的表單控件的HWND或ID,還是其他的東東,總之是能識別他的東西。。。這個我很困惑,沒辦法! 不清楚地方,大家要參照MSDN啊!(好東西呀!)
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有