VC 获取任务栏窗口的句柄
生活随笔
收集整理的這篇文章主要介紹了
VC 获取任务栏窗口的句柄
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文將介紹一個未公開的Win32 API函數:GetTaskmanWindow,利用它對Windows的任務欄進行操作。這個函數返回擁有任務欄按鈕的窗口句柄。在微軟的MSDN文檔中,對任務欄是這樣描述的:"……Windows界面包含一個特殊的應用程序桌面工具欄,叫做任務欄。任務欄可以用于在打開的不同窗口之間進行切換,以及啟動新的應用程序……。任務欄包含有開始菜單、任務欄按鈕、快捷菜單和狀態顯示區……"。可惜在Win32 API的正式問當中沒有能存取任務欄的函數。因此我們必須使用未公開的Win32 API函數。
下面是GetTaskmanWindow的原型:
方法2:
(1)獲取桌面窗口 (2)遍歷桌面的子窗口 (3)判斷類名為Shell_TrayWnd則為任務欄 (4)然后再遍歷任務欄的子窗口找到你要的窗口HWND g_hWndShell_TrayWnd = 0;//先遍歷桌面的子窗口,得到任務欄窗口句柄 BOOL CALLBACK EnumChildProc1(HWND hWnd, LPARAM lParam) {//成功返回值為拷貝到緩沖的字符數,失敗返回0TCHAR szText[33] = { 0 };if (0 == GetClassName(hWnd, szText, 32)){return TRUE;}//"Shell_TrayWnd"為任務欄窗口的句柄,可通過捕捉工具查看if (lstrcmp(szText, _T("Shell_TrayWnd")) == 0){g_hWndShell_TrayWnd = hWnd;return FALSE;}return TRUE; }//再遍歷任務欄上的子窗口,得到想要的子窗口句柄或標題 BOOL CALLBACK EnumChildProc2(HWND hWnd, LPARAM lParam) {//[注意]得到的窗口類名肯定不為空,但窗口標題可能為空TCHAR szClassName[MAX_PATH] = { 0 };GetClassName(hWnd, szClassName, MAX_PATH);TCHAR szTitleName[MAX_PATH] = { 0 };GetWindowText(hWnd, szTitleName, MAX_PATH);//OutputDebugString(szClassName);//OutputDebugString("\r\n");//例如:得到類名結果如下://說明:獲取任務欄上系統窗口很全面,但獲取其他用戶應用程序窗口不全面// TrayNotifyWnd// Button //"開始按鈕"的窗口類名稱// MSTaskListWClass //顯示"任務欄圖標"的窗口類名稱// CiceroUIWndFrame //右邊的顯示"輸入法"窗口類名稱// ToolbarWindow32 //右邊的顯示"托盤圖標"窗口類名稱// TrayClockWClass //右邊顯示"日期時間"的窗口類名稱// TrayShowDesktopButtonWClass //最右邊的"顯示桌面"的窗口類名稱// Edit //任務欄中的"地址欄"窗口類名稱// ... ...// SysPager //任務欄上其他應用程序窗口類名稱// ReBarWindow32// MSTaskSwWClass// Address Band Root// msctls_progress32// ComboBoxEx32return TRUE; }int _tmain(int argc, _TCHAR* argv[]) {//先枚舉桌面所有子窗口,匹配類名得到任務欄窗口句柄//回調函數返回true,則枚舉繼續直到枚舉完成;如果返回false,則中止枚舉.//或者不用枚舉,直接通過FindWindow("Shell_TrayWnd", NULL)一步得到任務欄窗口句柄EnumChildWindows(::GetDesktopWindow(), EnumChildProc1, 0);//得到任務欄句柄后,再枚舉任務欄上所有子窗口句柄if (g_hWndShell_TrayWnd){EnumChildWindows(g_hWndShell_TrayWnd, EnumChildProc2, 0);}return 0; }方法3:
//該函數是一個與EnumWindows或EnumDesktopWindows一起使用的應用程序定義的回調函數,它接收頂層窗口句柄. //參數hwnd: 頂層窗口句柄. //參數lParam: 指定在EnumWindows或EnumDesktopWindows中的應用程序定義值. //返回值:為繼續列表,回調函數必須返回TRUE;若停止列表,它必須返回FALSE. BOOL CALLBACK EnumTaskbarWnds(HWND hwnd, LPARAM lParam) {//濾掉不在任務欄顯示的窗口//參數GW_OWNER: 返回的句柄標識了是指定窗口的所有者窗口(如果存在).//返回值: 成功返回值為窗口句柄;如果與指定窗口有特定關系的窗口不存在,則返回值為NULL.if (!GetWindow(hwnd, GW_OWNER) && IsWindowVisible(hwnd)){TCHAR szClassName[MAX_PATH] = { 0 };GetClassName(hwnd, szClassName, MAX_PATH);TCHAR szTitleName[MAX_PATH] = { 0 };GetWindowText(hwnd, szTitleName, MAX_PATH);if (strcmp(szClassName, "Shell_TrayWnd") != 0 //濾掉任務欄本身&& strcmp(szClassName, "Progman") != 0) //濾掉桌面{OutputDebugString(szClassName);OutputDebugString("\r\n");//例如: 得到類名結果如下://說明: 獲取任務欄上應用程序很全,但獲取系統的不全(入開始菜單按鈕,托盤窗口,時間窗口等等)//HwndWrapper[DefaultDomain;;1917a89e-ad21-4281-974c-a495d1aa6534] //VisualStudio窗口//HwndWrapper[DefaultDomain;;d98f9c47-8d9c-42bd-87c9-9c924f9823be]//ConsoleWindowClass //控制臺窗口//Alternate Owner//Alternate Owner//IEFrame //瀏覽器窗口//TXGuiFoundation //QQ聊天窗口//Afx:00400000:8:00010003:00000000:00320807 //UEStudio//dbgviewClass //DebugView//EVERYTHING //Everything//Alternate Owner//Alternate Owner//Alternate Owner//Alternate Owner//Internet Explorer_Hidden}}return TRUE; }int _tmain(int argc, _TCHAR* argv[]) {//該函數枚舉所有屏幕上的頂層窗口,并將窗口句柄傳送給應用程序定義的回調函數.//參數lPararm:指定一個傳遞給回調函數的應用程序定義值.//返回值:如果函數成功,返回值為非零;如果函數失敗,返回值為零.EnumWindows(EnumTaskbarWnds, NULL);return 0; }總結
以上是生活随笔為你收集整理的VC 获取任务栏窗口的句柄的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为android系统通知栏怎么关闭,华
- 下一篇: tableau:柱图的两种实现方式