程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# Windows API運用之基於GetDesktopWindow取得桌面一切窗口句柄的辦法

C# Windows API運用之基於GetDesktopWindow取得桌面一切窗口句柄的辦法

編輯:C#入門知識

C# Windows API運用之基於GetDesktopWindow取得桌面一切窗口句柄的辦法。本站提示廣大學習愛好者:(C# Windows API運用之基於GetDesktopWindow取得桌面一切窗口句柄的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C# Windows API運用之基於GetDesktopWindow取得桌面一切窗口句柄的辦法正文


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

取得桌面一切窗口句柄的辦法

創立項目

文件->新建->項目…

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#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved