国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法

2019-10-29 21:22:47
字體:
來源:轉載
供稿:網友

本文實例講述了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,桌面窗口的句柄

獲得桌面所有窗口句柄的方法

創建項目

文件->新建->項目…

C#,Windows,API,GetDesktopWindow,獲得,桌面窗口,句柄

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#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临西县| 峨边| 绍兴县| 郁南县| 镇坪县| 兰州市| 闸北区| 永川市| 邹城市| 枣庄市| 陆川县| 元阳县| 岱山县| 巢湖市| 巴东县| 莱阳市| 九龙城区| 偏关县| 图木舒克市| 洪湖市| 阿瓦提县| 阿拉善左旗| 通州区| 平果县| 璧山县| 大渡口区| 衢州市| 利津县| 汉川市| 沂南县| 偃师市| 大渡口区| 大方县| 乌兰察布市| 江津市| 大埔区| 巴楚县| 宽甸| 贵州省| 迭部县| 苍南县|