C# Windows API應(yīng)用之基于GetDesktopWindow獲得桌面所有窗口句柄的方法
本文實(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)文章
快速了解如何在.NETCORE中使用Generic-Host建立主機(jī)
這篇文章主要介紹了如何在.NETCORE中使用Generic-Host建立主機(jī),文中代碼非常詳細(xì),可供大家參考,感興趣的朋友不妨閱讀完2020-05-05C#控制臺(tái)基礎(chǔ) List泛型集合與對(duì)應(yīng)的數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)代碼
這篇文章主要介紹了C#控制臺(tái)基礎(chǔ) List泛型集合與對(duì)應(yīng)的數(shù)組相互轉(zhuǎn)換實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-12-12C#調(diào)用Matlab生成的dll方法的詳細(xì)說明
這篇文章詳細(xì)介紹了C#調(diào)用Matlab生成的dll方法,有需要的朋友可以參考一下2013-09-09unity shader實(shí)現(xiàn)較完整光照效果
這篇文章主要為大家詳細(xì)介紹了unity shader實(shí)現(xiàn)較完整光照效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11