Windows API
Windows 這個多作業系統除了協調應用程式的執行、分配記憶體、管理資源…之外, 它同時也是一個很大的服務中心,調用這個服務中心的各種服務(每一種服務就是一個函數),可以幫應用程式達到開啟視窗、描繪圖形、使用周邊裝置等目的,由於這些函數服務的對象是應用程式(Application), 所以便稱之為 Application Programming Interface,簡稱 API 函數。WIN32 API也就是Microsoft Windows 32位平台的API。
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); } }