雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網!

C#教程

當前位置:主頁 > 軟件編程 > C#教程 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C#教程|點擊:

本文實例講述了C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法。分享給大家供大家參考,具體如下:

Windows API

Windows 這個多作業(yè)系統(tǒng)除了協(xié)調應用程序的執(zhí)行、分配內存、管理資源…之外, 它同時也是一個很大的服務中心,調用這個服務中心的各種服務(每一種服務就是一個函數),可以幫應用程式達到開啟視窗、描繪圖形、使用周邊設備等目的,由于這些函數服務的對象是應用程序(Application), 所以便稱之為 Application Programming Interface,簡稱 API 函數。WIN32 API也就是Microsoft Windows 32位平臺的應用程序編程接口。

GetDesktopWindow

函數功能:該函數返回桌面窗口的句柄。桌面窗口覆蓋整個屏幕。桌面窗口是一個要在其上繪制所有的圖標和其他窗口的區(qū)域。

函數原型: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,桌面窗口的句柄

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

創(chuàng)建項目

文件->新建->項目…

API導入

GetDesktopWindow

/// <summary>
/// 該函數返回桌面窗口的句柄。桌面窗口覆蓋整個屏幕。桌面窗口是一個要在其上繪制所有的圖標和其他窗口的區(qū)域。
/// 【說明】獲得代表整個屏幕的一個窗口(桌面窗口)句柄.
/// </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函數。
/// 備注:在循環(huán)體中調用函數EnumChildWindow比調用GetWindow函數可靠。調用GetWindow函數實現該任務的應用程序可能會陷入死循環(huán)或退回一個已被銷毀的窗口句柄。
/// 速查: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)返回的句柄標識了屬于指定窗口的處于使能狀態(tài)彈出式窗口(檢索使用第一個由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、循環(huán)取得桌面下的所有子窗口
  while (winPtr != IntPtr.Zero)
  {
    //4、繼續(xù)獲取下一個子窗口
    winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT);
  }
}

更多關于C#相關內容感興趣的讀者可查看本站專題:《C#窗體操作技巧匯總》、《C#數據結構與算法教程》、《C#常見控件用法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結》

希望本文所述對大家C#程序設計有所幫助。

上一篇:C#打開php鏈接傳參然后接收返回值的關鍵代碼

欄    目:C#教程

下一篇:C#處理和對接HTTP接口請求的方法

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

本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6292.html

網頁制作CMS教程網絡編程軟件編程腳本語言數據庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網 版權所有