欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年08月19日 16:39:47   作者:微wx笑  
這篇文章主要介紹了C# Windows API應(yīng)用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法,結(jié)合實(shí)例形式分析了GetDesktopWindow函數(shù)用于獲取窗口句柄的具體使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下

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

Windows API

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

GetDesktopWindow

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

函數(shù)原型:HWND GetDesktopWindow(VOID)

參數(shù):無。

返回值:函數(shù)返回桌面窗口的句柄。

速查:Windows NT:3.1以上版本;Windows:95以上版本:

頭文件:Winuser.h;庫(kù)文件: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();

【說明】

獲得代表整個(gè)屏幕的一個(gè)窗口(桌面窗口)句柄

【返回值】

Long,桌面窗口的句柄

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

創(chuàng)建項(xiàng)目

文件->新建->項(xiàng)目…

API導(dǎo)入

GetDesktopWindow

/// <summary>
/// 該函數(shù)返回桌面窗口的句柄。桌面窗口覆蓋整個(gè)屏幕。桌面窗口是一個(gè)要在其上繪制所有的圖標(biāo)和其他窗口的區(qū)域。
/// 【說明】獲得代表整個(gè)屏幕的一個(gè)窗口(桌面窗口)句柄.
/// </summary>
/// <returns>返回值:函數(shù)返回桌面窗口的句柄。</returns>
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetDesktopWindow();

GetWindow

/// <summary>
/// 該函數(shù)返回與指定窗口有特定關(guān)系(如Z序或所有者)的窗口句柄。
/// 函數(shù)原型:HWND GetWindow(HWND hWnd,UNIT nCmd);
/// </summary>
/// <param name="hWnd">窗口句柄。要獲得的窗口句柄是依據(jù)nCmd參數(shù)值相對(duì)于這個(gè)窗口的句柄。</param>
/// <param name="uCmd">說明指定窗口與要獲得句柄的窗口之間的關(guān)系。該參數(shù)值參考GetWindowCmd枚舉。</param>
/// <returns>返回值:如果函數(shù)成功,返回值為窗口句柄;如果與指定窗口有特定關(guān)系的窗口不存在,則返回值為NULL。
/// 若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
/// 備注:在循環(huán)體中調(diào)用函數(shù)EnumChildWindow比調(diào)用GetWindow函數(shù)可靠。調(diào)用GetWindow函數(shù)實(shí)現(xiàn)該任務(wù)的應(yīng)用程序可能會(huì)陷入死循環(huán)或退回一個(gè)已被銷毀的窗口句柄。
/// 速查:Windows NT:3.1以上版本;Windows:95以上版本;Windows CE:1.0以上版本;頭文件:winuser.h;庫(kù)文件:user32.lib。
/// </returns>
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, GetWindowCmd uCmd);

GetWindowCmd

/// <summary>
/// 窗口與要獲得句柄的窗口之間的關(guān)系。
/// </summary>
enum GetWindowCmd : uint
{
  /// <summary>
  /// 返回的句柄標(biāo)識(shí)了在Z序最高端的相同類型的窗口。
  /// 如果指定窗口是最高端窗口,則該句柄標(biāo)識(shí)了在Z序最高端的最高端窗口;
  /// 如果指定窗口是頂層窗口,則該句柄標(biāo)識(shí)了在z序最高端的頂層窗口:
  /// 如果指定窗口是子窗口,則句柄標(biāo)識(shí)了在Z序最高端的同屬窗口。
  /// </summary>
  GW_HWNDFIRST = 0,
  /// <summary>
  /// 返回的句柄標(biāo)識(shí)了在z序最低端的相同類型的窗口。
  /// 如果指定窗口是最高端窗口,則該柄標(biāo)識(shí)了在z序最低端的最高端窗口:
  /// 如果指定窗口是頂層窗口,則該句柄標(biāo)識(shí)了在z序最低端的頂層窗口;
  /// 如果指定窗口是子窗口,則句柄標(biāo)識(shí)了在Z序最低端的同屬窗口。
  /// </summary>
  GW_HWNDLAST = 1,
  /// <summary>
  /// 返回的句柄標(biāo)識(shí)了在Z序中指定窗口下的相同類型的窗口。
  /// 如果指定窗口是最高端窗口,則該句柄標(biāo)識(shí)了在指定窗口下的最高端窗口:
  /// 如果指定窗口是頂層窗口,則該句柄標(biāo)識(shí)了在指定窗口下的頂層窗口;
  /// 如果指定窗口是子窗口,則句柄標(biāo)識(shí)了在指定窗口下的同屬窗口。
  /// </summary>
  GW_HWNDNEXT = 2,
  /// <summary>
  /// 返回的句柄標(biāo)識(shí)了在Z序中指定窗口上的相同類型的窗口。
  /// 如果指定窗口是最高端窗口,則該句柄標(biāo)識(shí)了在指定窗口上的最高端窗口;
  /// 如果指定窗口是頂層窗口,則該句柄標(biāo)識(shí)了在指定窗口上的頂層窗口;
  /// 如果指定窗口是子窗口,則句柄標(biāo)識(shí)了在指定窗口上的同屬窗口。
  /// </summary>
  GW_HWNDPREV = 3,
  /// <summary>
  /// 返回的句柄標(biāo)識(shí)了指定窗口的所有者窗口(如果存在)。
  /// GW_OWNER與GW_CHILD不是相對(duì)的參數(shù),沒有父窗口的含義,如果想得到父窗口請(qǐng)使用GetParent()。
  /// 例如:例如有時(shí)對(duì)話框的控件的GW_OWNER,是不存在的。
  /// </summary>
  GW_OWNER = 4,
  /// <summary>
  /// 如果指定窗口是父窗口,則獲得的是在Tab序頂端的子窗口的句柄,否則為NULL。
  /// 函數(shù)僅檢查指定父窗口的子窗口,不檢查繼承窗口。
  /// </summary>
  GW_CHILD = 5,
  /// <summary>
  /// (WindowsNT 5.0)返回的句柄標(biāo)識(shí)了屬于指定窗口的處于使能狀態(tài)彈出式窗口(檢索使用第一個(gè)由GW_HWNDNEXT 查找到的滿足前述條件的窗口);
  /// 如果無使能窗口,則獲得的句柄與指定窗口相同。
  /// </summary>
  GW_ENABLEDPOPUP = 6
}
/*GetWindowCmd指定結(jié)果窗口與源窗口的關(guān)系,它們建立在下述常數(shù)基礎(chǔ)上:
   GW_CHILD
   尋找源窗口的第一個(gè)子窗口
   GW_HWNDFIRST
   為一個(gè)源子窗口尋找第一個(gè)兄弟(同級(jí))窗口,或?qū)ふ业谝粋€(gè)頂級(jí)窗口
   GW_HWNDLAST
   為一個(gè)源子窗口尋找最后一個(gè)兄弟(同級(jí))窗口,或?qū)ふ易詈笠粋€(gè)頂級(jí)窗口
   GW_HWNDNEXT
   為源窗口尋找下一個(gè)兄弟窗口
   GW_HWNDPREV
   為源窗口尋找前一個(gè)兄弟窗口
   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、獲得一個(gè)子窗口(這通常是一個(gè)頂層窗口,當(dāng)前活動(dòng)的窗口)
  IntPtr winPtr = GetWindow(desktopPtr, GetWindowCmd.GW_CHILD);
  //3、循環(huán)取得桌面下的所有子窗口
  while (winPtr != IntPtr.Zero)
  {
    //4、繼續(xù)獲取下一個(gè)子窗口
    winPtr = GetWindow(winPtr, GetWindowCmd.GW_HWNDNEXT);
  }
}

更多關(guān)于C#相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《C#窗體操作技巧匯總》、《C#數(shù)據(jù)結(jié)構(gòu)與算法教程》、《C#常見控件用法教程》、《C#面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》及《C#程序設(shè)計(jì)之線程使用技巧總結(jié)

希望本文所述對(duì)大家C#程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評(píng)論