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