Windows API
Windows 這個(gè)多作業(yè)系統(tǒng)除了協(xié)調(diào)應(yīng)用程序的執(zhí)行,、分配內(nèi)存,、管理資源…之外,, 它同時(shí)也是一個(gè)很大的服務(wù)中心,,調(diào)用這個(gè)服務(wù)中心的各種服務(wù)(每一種服務(wù)就是一個(gè)函數(shù)),,可以幫應(yīng)用程式達(dá)到開啟視窗,、描繪圖形,、使用周邊設(shè)備等目的,由于這些函數(shù)服務(wù)的對(duì)象是應(yīng)用程序(Application),, 所以便稱之為 Application Programming Interface,,簡稱 API 函數(shù)。WIN32 API也就是Microsoft Windows 32位平臺(tái)的應(yīng)用程序編程接口,。
GetDesktopWindow
函數(shù)功能:該函數(shù)返回桌面窗口的句柄,。桌面窗口覆蓋整個(gè)屏幕。桌面窗口是一個(gè)要在其上繪制所有的圖標(biāo)和其他窗口的區(qū)域,。
函數(shù)原型:HWND GetDesktopWindow(VOID)
參數(shù):無,。
返回值:函數(shù)返回桌面窗口的句柄。
速查:Windows NT:3.1以上版本,;Windows:95以上版本:,;
頭文件:Winuser.h;庫文件:user32.lib,。
【聲明】
vb
Public Declare Function GetDesktopWindow Lib “user32” Alias “GetDesktopWindow” () As Long
vb_net
Public Declare Function GetDesktopWindow Lib “user32” Alias “GetDesktopWindow” () As Integer
c#
[DllImport(“user32.dll”, EntryPoint = “GetDesktopWindow”, CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetDesktopWindow();
【說明】
獲得代表整個(gè)屏幕的一個(gè)窗口(桌面窗口)句柄
【返回值】
Long,,桌面窗口的句柄
獲得桌面所有窗口句柄的方法
創(chuàng)建項(xiàng)目
文件->新建->項(xiàng)目…
API導(dǎo)入
GetDesktopWindow
/// <summary>
/// 該函數(shù)返回桌面窗口的句柄。桌面窗口覆蓋整個(gè)屏幕,。桌面窗口是一個(gè)要在其上繪制所有的圖標(biāo)和其他窗口的區(qū)域,。
/// 【說明】獲得代表整個(gè)屏幕的一個(gè)窗口(桌面窗口)句柄.
/// </summary>
/// <returns>返回值:函數(shù)返回桌面窗口的句柄。</returns>
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetDesktopWindow();
GetWindow
/// <summary>
/// 該函數(shù)返回與指定窗口有特定關(guān)系(如Z序或所有者)的窗口句柄,。
/// 函數(shù)原型:HWND GetWindow(HWND hWnd,,UNIT nCmd);
/// </summary>
/// <param name="hWnd">窗口句柄,。要獲得的窗口句柄是依據(jù)nCmd參數(shù)值相對(duì)于這個(gè)窗口的句柄,。</param>
/// <param name="uCmd">說明指定窗口與要獲得句柄的窗口之間的關(guān)系,。該參數(shù)值參考GetWindowCmd枚舉。</param>
/// <returns>返回值:如果函數(shù)成功,,返回值為窗口句柄,;如果與指定窗口有特定關(guān)系的窗口不存在,則返回值為NULL,。
/// 若想獲得更多錯(cuò)誤信息,,請(qǐng)調(diào)用GetLastError函數(shù)。
/// 備注:在循環(huán)體中調(diào)用函數(shù)EnumChildWindow比調(diào)用GetWindow函數(shù)可靠,。調(diào)用GetWindow函數(shù)實(shí)現(xiàn)該任務(wù)的應(yīng)用程序可能會(huì)陷入死循環(huán)或退回一個(gè)已被銷毀的窗口句柄。
/// 速查:Windows NT:3.1以上版本,;Windows:95以上版本,;Windows CE:1.0以上版本;頭文件:winuser.h,;庫文件:user32.lib,。
/// </returns>
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd);
GetWindowCmd
/// <summary>
/// 窗口與要獲得句柄的窗口之間的關(guān)系。
/// </summary>
enum GetWindowCmd : uint
{
/// <summary>
/// 返回的句柄標(biāo)識(shí)了在Z序最高端的相同類型的窗口,。
/// 如果指定窗口是最高端窗口,,則該句柄標(biāo)識(shí)了在Z序最高端的最高端窗口;
/// 如果指定窗口是頂層窗口,,則該句柄標(biāo)識(shí)了在z序最高端的頂層窗口:
/// 如果指定窗口是子窗口,,則句柄標(biāo)識(shí)了在Z序最高端的同屬窗口。
/// </summary>
GW_HWNDFIRST = 0,
/// <summary>
/// 返回的句柄標(biāo)識(shí)了在z序最低端的相同類型的窗口,。
/// 如果指定窗口是最高端窗口,,則該柄標(biāo)識(shí)了在z序最低端的最高端窗口:
/// 如果指定窗口是頂層窗口,則該句柄標(biāo)識(shí)了在z序最低端的頂層窗口,;
/// 如果指定窗口是子窗口,,則句柄標(biāo)識(shí)了在Z序最低端的同屬窗口。
/// </summary>
GW_HWNDLAST = 1,
/// <summary>
/// 返回的句柄標(biāo)識(shí)了在Z序中指定窗口下的相同類型的窗口,。
/// 如果指定窗口是最高端窗口,,則該句柄標(biāo)識(shí)了在指定窗口下的最高端窗口:
/// 如果指定窗口是頂層窗口,則該句柄標(biāo)識(shí)了在指定窗口下的頂層窗口,;
/// 如果指定窗口是子窗口,,則句柄標(biāo)識(shí)了在指定窗口下的同屬窗口。
/// </summary>
GW_HWNDNEXT = 2,
/// <summary>
/// 返回的句柄標(biāo)識(shí)了在Z序中指定窗口上的相同類型的窗口,。
/// 如果指定窗口是最高端窗口,,則該句柄標(biāo)識(shí)了在指定窗口上的最高端窗口;
/// 如果指定窗口是頂層窗口,,則該句柄標(biāo)識(shí)了在指定窗口上的頂層窗口,;
/// 如果指定窗口是子窗口,則句柄標(biāo)識(shí)了在指定窗口上的同屬窗口。
/// </summary>
GW_HWNDPREV = 3,
/// <summary>
/// 返回的句柄標(biāo)識(shí)了指定窗口的所有者窗口(如果存在),。
/// GW_OWNER與GW_CHILD不是相對(duì)的參數(shù),,沒有父窗口的含義,如果想得到父窗口請(qǐng)使用GetParent(),。
/// 例如:例如有時(shí)對(duì)話框的控件的GW_OWNER,,是不存在的。
/// </summary>
GW_OWNER = 4,
/// <summary>
/// 如果指定窗口是父窗口,,則獲得的是在Tab序頂端的子窗口的句柄,,否則為NULL。
/// 函數(shù)僅檢查指定父窗口的子窗口,,不檢查繼承窗口,。
/// </summary>
GW_CHILD = 5,
/// <summary>
/// (WindowsNT 5.0)返回的句柄標(biāo)識(shí)了屬于指定窗口的處于使能狀態(tài)彈出式窗口(檢索使用第一個(gè)由GW_HWNDNEXT 查找到的滿足前述條件的窗口);
/// 如果無使能窗口,,則獲得的句柄與指定窗口相同,。
/// </summary>
GW_ENABLEDPOPUP = 6
}
/*GetWindowCmd指定結(jié)果窗口與源窗口的關(guān)系,它們建立在下述常數(shù)基礎(chǔ)上:
GW_CHILD
尋找源窗口的第一個(gè)子窗口
GW_HWNDFIRST
為一個(gè)源子窗口尋找第一個(gè)兄弟(同級(jí))窗口,,或?qū)ふ业谝粋€(gè)頂級(jí)窗口
GW_HWNDLAST
為一個(gè)源子窗口尋找最后一個(gè)兄弟(同級(jí))窗口,,或?qū)ふ易詈笠粋€(gè)頂級(jí)窗口
GW_HWNDNEXT
為源窗口尋找下一個(gè)兄弟窗口
GW_HWNDPREV
為源窗口尋找前一個(gè)兄弟窗口
GW_OWNER
尋找窗口的所有者
*/
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
編寫方法
/// <summary>
/// 獲得桌面所有窗口句柄的方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
dataGridView1.Rows.Clear();
//1、獲取桌面窗口的句柄
IntPtr desktopPtr = GetDesktopWindow();
//2,、獲得一個(gè)子窗口(這通常是一個(gè)頂層窗口,,當(dāng)前活動(dòng)的窗口)
IntPtr winPtr = GetWindow(desktopPtr, GetWindowCmd.GW_CHILD);
//3、循環(huán)取得桌面下的所有子窗口
while (winPtr != IntPtr.Zero)
{
//4,、繼續(xù)獲取下一個(gè)子窗口
winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
|