C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法
本文實例講述了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#教程
本文標題:C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/6292.html
您可能感興趣的文章
- 01-10C#實現自定義windows系統(tǒng)日志的方法
 - 01-10C#3.0使用EventLog類寫Windows事件日志的方法
 - 01-10C#使用windows服務開啟應用程序的方法
 - 01-10C#實現將應用程序設置為開機啟動的方法
 - 01-10C#操作 JSON方法匯總
 - 01-10C#圖片處理3種高級應用
 - 01-10C#中Json字符串的各種應用類實例講解
 - 01-10C#實現托盤程序并禁止多個應用實例運行的方法
 - 01-10解析C#中斷言與異常的應用方式及異常處理的流程控制
 - 01-10Windows系統(tǒng)中使用C#讀取文本文件內容的小示例
 


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
 - 01-10關于ASP網頁無法打開的解決方案
 - 01-10WinForm限制窗體不能移到屏幕外的方法
 - 01-10WinForm繪制圓角的方法
 - 01-10C#實現txt定位指定行完整實例
 - 01-10WinForm實現仿視頻播放器左下角滾動新
 - 01-10C#停止線程的方法
 - 01-10C#實現清空回收站的方法
 - 01-10C#通過重寫Panel改變邊框顏色與寬度的
 - 01-10C#實現讀取注冊表監(jiān)控當前操作系統(tǒng)已
 
隨機閱讀
- 08-05織夢dedecms什么時候用欄目交叉功能?
 - 01-10使用C語言求解撲克牌的順子及n個骰子
 - 08-05dedecms(織夢)副欄目數量限制代碼修改
 - 01-11ajax實現頁面的局部加載
 - 04-02jquery與jsp,用jquery
 - 08-05DEDE織夢data目錄下的sessions文件夾有什
 - 01-10C#中split用法實例總結
 - 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
 - 01-10SublimeText編譯C開發(fā)環(huán)境設置
 - 01-10delphi制作wav文件的方法
 


