天天看點

[WinAPI] 擷取視窗句柄的幾種方法

1、使用FindWindow函數擷取視窗句柄

示例:使用FindWindow函數擷取視窗句柄,然後獲得視窗大小,并且移動視窗到指定位置。

我們想獲得酷我音樂盒的視窗句柄并移動它,該怎麼辦呢?

[WinAPI] 擷取視窗句柄的幾種方法

首先打開VC或者VS裡面tool中的SPY++點選查找視窗如下:

PS:把那個靶心似的的東西移動到想查找的視窗上,這裡是酷我音樂盒,下面會出現視窗的資訊,包括視窗的句柄、名字、類、類型、大小和位置。點選OK還有更多資訊~

[WinAPI] 擷取視窗句柄的幾種方法

PS:因為FindWindowA(LPCSTR lpClassName ,LPCSTR lpWindowName);既可以通過視窗類名又可以通過視窗名稱查找視窗句柄,如果隻知道一個就把另一個寫成null.這裡我們會發現它的視窗名稱會随着播放的歌曲的變化而變化,是以通過視窗名來查找視窗句柄是不明智的(不過我們可以通過視窗名字獲得目前播放音樂的名稱哦!),是以我們用視窗類名獲得視窗句柄。

哈哈,剩下2個函數都很簡單,看看應該能夠了解,俺就不介紹啦~

1 #include <Windows.h>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <iostream.h>
 5 
 6 int main(int argc, char* argv[])
 7 {
 8     //根據視窗類名擷取酷我音樂視窗句柄
 9     HWND hq=FindWindow("kwmusicmaindlg",NULL);    
10 
11     //得到酷我音樂視窗大小
12     RECT rect;  
13     GetWindowRect(hq,&rect);     
14     int w=rect.right-rect.left,h=rect.bottom-rect.top;
15     cout<<"寬:"<<w<<" "<<"高:"<<h<<endl;
16     
17     //移動酷我音樂視窗位置
18     MoveWindow(hq,100,100,w,h,false);
19     
20     //得到桌面視窗
21     HWND hd=GetDesktopWindow();
22     GetWindowRect(hd,&rect);     
23     w=rect.right-rect.left;
24     h=rect.bottom-rect.top;
25     cout<<"寬:"<<w<<" "<<"高:"<<h<<endl;
26     
27     return 0;
28 }      

>_<:這裡GetWindowRect函數可以獲得視窗矩形,根據視窗矩形可以計算視窗大小;MoveWindow可以将視窗移動到指定位置而且第4、5個參數還能修改視窗大小哦!

>_<:下面我又蛇添足加了個獲得桌面的大小的操作~

2、擷取所有頂層視窗以及它們的子視窗

示例:使用EnumWindows和EnumChildWindows函數以及相對的回調函數EnumWindowsProc和EnumChildWindowsProc擷取所有頂層視窗以及它們的子視窗

注意:有些視窗做了特殊處理,比如QQ是不能通過這個方法獲得的!

[WinAPI] 擷取視窗句柄的幾種方法

>_<:如上圖,有些視窗沒有名字,是以顯示為空~

1 #include <Windows.h>
 2 #include <stdio.h>
 3 #include <tchar.h>
 4 #include <string.h>
 5 #include <iostream.h>
 6 
 7 int Pnum=0,Cnum;//父視窗數量,每一級父視窗的子視窗數量
 8 
 9 //---------------------------------------------------------
10 //EnumChildWindows回調函數,hwnd為指定的父視窗
11 //---------------------------------------------------------
12 BOOL CALLBACK EnumChildWindowsProc(HWND hWnd,LPARAM lParam)
13 {
14     char WindowTitle[100]={0};  
15     Cnum++;
16     ::GetWindowText(hWnd,WindowTitle,100);
17     printf("--|%d :%s\n",Cnum,WindowTitle);
18     return true;   
19 }
20 //---------------------------------------------------------
21 //EnumWindows回調函數,hwnd為發現的頂層視窗
22 //---------------------------------------------------------
23 BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lParam)
24 {
25     if(GetParent(hWnd)==NULL && IsWindowVisible(hWnd))  //判斷是否頂層視窗并且可見
26     {
27         Pnum++;
28         Cnum=0;
29         char WindowTitle[100]={0};
30         ::GetWindowText(hWnd,WindowTitle,100);
31         printf("-------------------------------------------\n");
32         printf("%d: %s\n",Pnum,WindowTitle);
33         EnumChildWindows(hWnd,EnumChildWindowsProc,NULL); //擷取父視窗的所有子視窗
34     }
35     return true;   
36 }
37 //---------------------------------------------------------
38 //main函數
39 //---------------------------------------------------------
40 int main()
41 {
42     //擷取螢幕上所有的頂層視窗,每發現一個視窗就調用回調函數一次
43     EnumWindows(EnumWindowsProc ,NULL );
44     getchar();
45     return 0;
46 }      

3、使用GetDesktopWindow和GetNextWindow函數得到所有的子視窗

PS:這樣周遊之後就可以找到你想要的視窗句柄啦(不要做壞事呀!哈哈~)

[WinAPI] 擷取視窗句柄的幾種方法
1 #include <Windows.h>
 2 #include <stdio.h>
 3 #include <tchar.h>
 4 #include <string.h>
 5 #include <iostream.h>
 6 
 7 int main()
 8 {    
 9     HWND hd=GetDesktopWindow();        //得到桌面視窗
10     hd=GetWindow(hd,GW_CHILD);        //得到螢幕上第一個子視窗
11     char s[200]={0};
12     int num=1;
13     while(hd!=NULL)                    //循環得到所有的子視窗
14     {
15         memset(s,0,200);
16         GetWindowText(hd,s,200);
17         cout<<num++<<": "<<s<<endl;
18         hd=GetNextWindow(hd,GW_HWNDNEXT);
19     }
20     getchar();
21     return 0;
22 }      

參考連結:http://blog.csdn.net/dazhong159/article/details/7903382

繼續閱讀