[WinAPI] 獲取窗口句柄的幾種方法


 

1、使用FindWindow函數獲取窗口句柄

示例:使用FindWindow函數獲取窗口句柄,然后獲得窗口大小,並且移動窗口到指定位置。

我們想獲得酷我音樂盒的窗口句柄並移動它,該怎么辦呢?

首先打開VC或者VS里面tool中的SPY++點擊查找窗口如下:

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

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是不能通過這個方法獲得的!

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

 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:這樣遍歷之后就可以找到你想要的窗口句柄啦(不要做壞事呀!哈哈~)

 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


免責聲明!

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



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