本文實例講述了C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法。分享給大家供大家參考,具體如下:
Windows API
Windows 這個多作業系統除了協調應用程序的執行、分配內存、管理資源…之外, 它同時也是一個很大的服務中心,調用這個服務中心的各種服務(每一種服務就是一個函數),可以幫應用程式達到開啟視窗、描繪圖形、使用周邊設備等目的,由于這些函數服務的對象是應用程序(Application), 所以便稱之為 Application Programming Interface,簡稱 API 函數。WIN32 API也就是Microsoft Windows 32位平臺的應用程序編程接口。
GetDesktopWindow
函數功能:該函數返回桌面窗口的句柄。桌面窗口覆蓋整個屏幕。桌面窗口是一個要在其上繪制所有的圖標和其他窗口的區域。
函數原型:HWND GetDesktopWindow(VOID)
參數:無。
返回值:函數返回桌面窗口的句柄。
速查: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();
【說明】
獲得代表整個屏幕的一個窗口(桌面窗口)句柄
【返回值】
Long,桌面窗口的句柄
獲得桌面所有窗口句柄的方法
創建項目
文件->新建->項目…
API導入
GetDesktopWindow
/// <summary>/// 該函數返回桌面窗口的句柄。桌面窗口覆蓋整個屏幕。桌面窗口是一個要在其上繪制所有的圖標和其他窗口的區域。/// 【說明】獲得代表整個屏幕的一個窗口(桌面窗口)句柄./// </summary>/// <returns>返回值:函數返回桌面窗口的句柄。</returns>[DllImport("user32.dll", EntryPoint = "GetDesktopWindow", CharSet = CharSet.Auto, SetLastError = true)]static extern IntPtr GetDesktopWindow();
GetWindow
/// <summary>/// 該函數返回與指定窗口有特定關系(如Z序或所有者)的窗口句柄。/// 函數原型:HWND GetWindow(HWND hWnd,UNIT nCmd);/// </summary>/// <param name="hWnd">窗口句柄。要獲得的窗口句柄是依據nCmd參數值相對于這個窗口的句柄。</param>/// <param name="uCmd">說明指定窗口與要獲得句柄的窗口之間的關系。該參數值參考GetWindowCmd枚舉。</param>/// <returns>返回值:如果函數成功,返回值為窗口句柄;如果與指定窗口有特定關系的窗口不存在,則返回值為NULL。/// 若想獲得更多錯誤信息,請調用GetLastError函數。/// 備注:在循環體中調用函數EnumChildWindow比調用GetWindow函數可靠。調用GetWindow函數實現該任務的應用程序可能會陷入死循環或退回一個已被銷毀的窗口句柄。/// 速查: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>/// 窗口與要獲得句柄的窗口之間的關系。/// </summary>enum GetWindowCmd : uint{ /// <summary> /// 返回的句柄標識了在Z序最高端的相同類型的窗口。 /// 如果指定窗口是最高端窗口,則該句柄標識了在Z序最高端的最高端窗口; /// 如果指定窗口是頂層窗口,則該句柄標識了在z序最高端的頂層窗口: /// 如果指定窗口是子窗口,則句柄標識了在Z序最高端的同屬窗口。 /// </summary> GW_HWNDFIRST = 0, /// <summary> /// 返回的句柄標識了在z序最低端的相同類型的窗口。 /// 如果指定窗口是最高端窗口,則該柄標識了在z序最低端的最高端窗口: /// 如果指定窗口是頂層窗口,則該句柄標識了在z序最低端的頂層窗口; /// 如果指定窗口是子窗口,則句柄標識了在Z序最低端的同屬窗口。 /// </summary> GW_HWNDLAST = 1, /// <summary> /// 返回的句柄標識了在Z序中指定窗口下的相同類型的窗口。 /// 如果指定窗口是最高端窗口,則該句柄標識了在指定窗口下的最高端窗口: /// 如果指定窗口是頂層窗口,則該句柄標識了在指定窗口下的頂層窗口; /// 如果指定窗口是子窗口,則句柄標識了在指定窗口下的同屬窗口。 /// </summary> GW_HWNDNEXT = 2, /// <summary> /// 返回的句柄標識了在Z序中指定窗口上的相同類型的窗口。 /// 如果指定窗口是最高端窗口,則該句柄標識了在指定窗口上的最高端窗口; /// 如果指定窗口是頂層窗口,則該句柄標識了在指定窗口上的頂層窗口; /// 如果指定窗口是子窗口,則句柄標識了在指定窗口上的同屬窗口。 /// </summary> GW_HWNDPREV = 3, /// <summary> /// 返回的句柄標識了指定窗口的所有者窗口(如果存在)。 /// GW_OWNER與GW_CHILD不是相對的參數,沒有父窗口的含義,如果想得到父窗口請使用GetParent()。 /// 例如:例如有時對話框的控件的GW_OWNER,是不存在的。 /// </summary> GW_OWNER = 4, /// <summary> /// 如果指定窗口是父窗口,則獲得的是在Tab序頂端的子窗口的句柄,否則為NULL。 /// 函數僅檢查指定父窗口的子窗口,不檢查繼承窗口。 /// </summary> GW_CHILD = 5, /// <summary> /// (WindowsNT 5.0)返回的句柄標識了屬于指定窗口的處于使能狀態彈出式窗口(檢索使用第一個由GW_HWNDNEXT 查找到的滿足前述條件的窗口); /// 如果無使能窗口,則獲得的句柄與指定窗口相同。 /// </summary> GW_ENABLEDPOPUP = 6}/*GetWindowCmd指定結果窗口與源窗口的關系,它們建立在下述常數基礎上: GW_CHILD 尋找源窗口的第一個子窗口 GW_HWNDFIRST 為一個源子窗口尋找第一個兄弟(同級)窗口,或尋找第一個頂級窗口 GW_HWNDLAST 為一個源子窗口尋找最后一個兄弟(同級)窗口,或尋找最后一個頂級窗口 GW_HWNDNEXT 為源窗口尋找下一個兄弟窗口 GW_HWNDPREV 為源窗口尋找前一個兄弟窗口 GW_OWNER 尋找窗口的所有者*/
編寫方法
/// <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、獲得一個子窗口(這通常是一個頂層窗口,當前活動的窗口) IntPtr winPtr = GetWindow(desktopPtr, GetWindowCmd.GW_CHILD); //3、循環取得桌面下的所有子窗口 while (winPtr != IntPtr.Zero) { //4、繼續獲取下一個子窗口 winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT); }}
更多關于C#相關內容感興趣的讀者可查看本站專題:《C#窗體操作技巧匯總》、《C#數據結構與算法教程》、《C#常見控件用法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結》
希望本文所述對大家C#程序設計有所幫助。
新聞熱點
疑難解答