C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法
本文實例講述了C# Windows API應用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法。分享給大家供大家參考,具體如下:
Windows API
Windows 這個多作業(yè)系統(tǒng)除了協(xié)調(diào)應用程序的執(zhí)行、分配內(nèi)存、管理資源…之外, 它同時也是一個很大的服務中心,調(diào)用這個服務中心的各種服務(每一種服務就是一個函數(shù)),可以幫應用程式達到開啟視窗、描繪圖形、使用周邊設備等目的,由于這些函數(shù)服務的對象是應用程序(Application), 所以便稱之為 Application Programming Interface,簡稱 API 函數(shù)。WIN32 API也就是Microsoft Windows 32位平臺的應用程序編程接口。
GetDesktopWindow
函數(shù)功能:該函數(shù)返回桌面窗口的句柄。桌面窗口覆蓋整個屏幕。桌面窗口是一個要在其上繪制所有的圖標和其他窗口的區(qū)域。
函數(shù)原型:HWND GetDesktopWindow(VOID)
參數(shù):無。
返回值:函數(shù)返回桌面窗口的句柄。
速查: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>
/// 該函數(shù)返回桌面窗口的句柄。桌面窗口覆蓋整個屏幕。桌面窗口是一個要在其上繪制所有的圖標和其他窗口的區(qū)域。
/// 【說明】獲得代表整個屏幕的一個窗口(桌面窗口)句柄.
/// </summary>
/// <returns>返回值:函數(shù)返回桌面窗口的句柄。</returns>
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetDesktopWindow();
GetWindow
/// <summary>
/// 該函數(shù)返回與指定窗口有特定關系(如Z序或所有者)的窗口句柄。
/// 函數(shù)原型:HWND GetWindow(HWND hWnd,UNIT nCmd);
/// </summary>
/// <param name="hWnd">窗口句柄。要獲得的窗口句柄是依據(jù)nCmd參數(shù)值相對于這個窗口的句柄。</param>
/// <param name="uCmd">說明指定窗口與要獲得句柄的窗口之間的關系。該參數(shù)值參考GetWindowCmd枚舉。</param>
/// <returns>返回值:如果函數(shù)成功,返回值為窗口句柄;如果與指定窗口有特定關系的窗口不存在,則返回值為NULL。
/// 若想獲得更多錯誤信息,請調(diào)用GetLastError函數(shù)。
/// 備注:在循環(huán)體中調(diào)用函數(shù)EnumChildWindow比調(diào)用GetWindow函數(shù)可靠。調(diào)用GetWindow函數(shù)實現(xiàn)該任務的應用程序可能會陷入死循環(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不是相對的參數(shù),沒有父窗口的含義,如果想得到父窗口請使用GetParent()。
/// 例如:例如有時對話框的控件的GW_OWNER,是不存在的。
/// </summary>
GW_OWNER = 4,
/// <summary>
/// 如果指定窗口是父窗口,則獲得的是在Tab序頂端的子窗口的句柄,否則為NULL。
/// 函數(shù)僅檢查指定父窗口的子窗口,不檢查繼承窗口。
/// </summary>
GW_CHILD = 5,
/// <summary>
/// (WindowsNT 5.0)返回的句柄標識了屬于指定窗口的處于使能狀態(tài)彈出式窗口(檢索使用第一個由GW_HWNDNEXT 查找到的滿足前述條件的窗口);
/// 如果無使能窗口,則獲得的句柄與指定窗口相同。
/// </summary>
GW_ENABLEDPOPUP = 6
}
/*GetWindowCmd指定結果窗口與源窗口的關系,它們建立在下述常數(shù)基礎上:
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#相關內(nèi)容感興趣的讀者可查看本站專題:《C#窗體操作技巧匯總》、《C#數(shù)據(jù)結構與算法教程》、《C#常見控件用法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結》
希望本文所述對大家C#程序設計有所幫助。
相關文章
c# 基于GMap.NET實現(xiàn)電子圍欄功能(WPF版)
這篇文章主要介紹了c# 基于GMap.NET實現(xiàn)電子圍欄功能(WPF版),幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下2021-03-03
C#中的小數(shù)和百分數(shù)計算與byte數(shù)組操作
這篇文章介紹了C#中的小數(shù)和百分數(shù)計算與byte數(shù)組操作,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04
在C#項目中調(diào)用C++編寫的動態(tài)庫的三種方式
這篇文章給大家介紹了三種方式詳解如何在C#項目中調(diào)用C++編寫的動態(tài)庫,文中通過代碼示例給大家介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-01-01
C#使用Fody實現(xiàn)監(jiān)控方法執(zhí)行時間
這篇文章主要為大家詳細介紹了C#如何使用Fody實現(xiàn)監(jiān)控方法執(zhí)行時間,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解下2023-11-11
C#利用ScriptControl動態(tài)執(zhí)行JS和VBS腳本
C#中利用ScriptControl動態(tài)執(zhí)行JS和VBS腳本的實現(xiàn)方法,需要的朋友可以參考下2013-04-04

