日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC 获取任务栏窗口的句柄

發布時間:2024/1/8 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC 获取任务栏窗口的句柄 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


本文將介紹一個未公開的Win32 API函數:GetTaskmanWindow,利用它對Windows的任務欄進行操作。這個函數返回擁有任務欄按鈕的窗口句柄。在微軟的MSDN文檔中,對任務欄是這樣描述的:"……Windows界面包含一個特殊的應用程序桌面工具欄,叫做任務欄。任務欄可以用于在打開的不同窗口之間進行切換,以及啟動新的應用程序……。任務欄包含有開始菜單、任務欄按鈕、快捷菜單和狀態顯示區……"。可惜在Win32 API的正式問當中沒有能存取任務欄的函數。因此我們必須使用未公開的Win32 API函數。
下面是GetTaskmanWindow的原型:

//方法1. 獲取任務欄句柄 //說明:僅僅是顯示已啟動應用程序的部分,不包括"開始菜單"、"語言區"、"托盤區"、"時鐘區"和"顯示桌面" typedef HWND (WINAPI *PROCGETTASKMANWND)(void); PROCGETTASKMANWND GetTaskmanWindow;void main(int argc, char* argv[]) {HMODULE hUser32 = GetModuleHandle("user32");if (!hUser32){return;}GetTaskmanWindow = (PROCGETTASKMANWND)GetProcAddress(hUser32,"GetTaskmanWindow"); if (!GetTaskmanWindow){return;}HWND hWnd = GetTaskmanWindow();if (!hWnd){return;} }

方法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 获取任务栏窗口的句柄的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色在线视频网址 | 成人黄色片免费 | 精品一区在线视频 | 国产毛片18| 狠狠干夜夜| 欧美自拍偷拍 | 色欧美在线 | 亚洲av熟女一区 | 国产成人77亚洲精品www | 欧美激情一区在线 | 欧美人与动物xxxx | 中文字幕一区二区人妻视频 | 国产成人在线看 | 国产jizz18女人高潮 | 国产又爽又黄无码无遮挡在线观看 | 国产精品乱码一区 | 91九色网站 | 久久精品99国产国产精 | 日韩精品在线免费 | 在线观看日韩视频 | 国产亚洲网站 | 高清一区二区三区四区 | 日日噜噜夜夜狠狠久久波多野 | 日本后进式猛烈xx00动态图 | 啪啪av网 | 国产东北真实交换多p免视频 | 97免费在线视频 | 日本少妇喂奶 | 日日日插插插 | 亚洲综合p| 最近最经典中文mv字幕 | 搡老熟女老女人一区二区 | 欧美色图网站 | 日韩成人高清 | 国产精品swag| 污污视频在线播放 | 亚洲综合网站 | 91影院在线观看 | 人妻饥渴偷公乱中文字幕 | jizzjizzjizz亚洲| 亚洲成人影音 | 自拍偷拍色综合 | 免费涩涩 | 欧美在线观看视频一区 | 国产熟妇一区二区三区aⅴ网站 | 91在线精品一区二区 | 裸体按摩www性xxxcom | 最新av网址在线观看 | 成人免费短视频 | 好色综合 | 成人夜间视频 | 麻豆人妻少妇精品无码专区 | 久操久操久操 | 午夜av片 | 日本天堂在线播放 | 国产乱淫片视频 | 精品美女一区二区三区 | 双性人妖互交localhost | 丰满人妻熟妇乱偷人无码 | 久久久久毛片 | 狠狠干2022 | 久久6视频 | 黑巨茎大战欧美白妞 | 成人7777| 91久久久久久 | 在线看片你懂的 | 亚洲一区国产 | 久久久久久久亚洲精品 | av免费视屏 | 国产微拍精品 | 色视频导航 | 久久久久久国产精品三级玉女聊斋 | 国产无遮挡一区二区三区毛片日本 | 婷婷激情综合 | 亚洲视频免费在线 | 欧美成人影音 | 亚洲欧洲色图 | 97caocao| www九九九 | 成人在线观 | 中文字幕巨乳 | 日本女人毛片 | 黄色香蕉网站 | 8x8ⅹ8成人免费视频观看 | 国产欧美日韩精品在线 | 国产乱码精品一区二区三区忘忧草 | 夜久久久 | 欧美一区二区三区久久精品 | 爱爱15p | 在线观看国产亚洲 | 久久波多野结衣 | 99er视频| 成人激情文学 | 华丽的外出在线 | 欧美女同在线 | 老妇裸体性猛交视频 | 亚洲综合一区在线 | 国产熟妇搡bbbb搡bbbb | 色爽 |