本文将介绍一个未公开的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 获取任务栏窗口的句柄相关推荐

  1. VC获取其它程序窗口焦点方法 AttachThreadInput的用法

    1.不同线程的处理方法 如何在2K/xp下使窗口获取焦点 //捕捉并设置当前焦点窗口为我们的窗口 AttachThreadInput(     GetWindowThreadProcessId(    ...

  2. VC 获取控制台窗体的句柄(hWnd)

    在Windows中,句柄是外国话,理解为编号的意思,只要你知道了这个窗口的句柄,就可以对这个窗体进行操作--移动窗体.改变窗体大小.把窗体极小化为图标等.Windows API函数中的句柄代表一些特殊 ...

  3. 获取窗口的句柄方法总结

     句柄获取方法(获取该窗口的句柄后,即可向该窗口类类发送消息.处理程序): 例如:::PostMessage("句柄", WM_USER_DRAWVIEWPIC_EDS, 0, ...

  4. 获取控制台窗口的句柄(HWND)和程序中输出回车键

    一.获取窗口句柄基于类名或窗口名称: http://support.microsoft.com/kb/124103/zh-cn Win32 API 提供用于获取与一个控制台应用程序相关联的窗口句柄没有 ...

  5. 按键精灵通过句柄获取窗口坐标_按键精灵怎么获取同名窗口的句柄

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:按键精灵怎么获取同名窗口的句柄回答:命令名称: Search 遍历符合窗口 命令功能: 遍历符合窗口标题的句柄保存到数组里 命令参数 ...

  6. C# API之常用操作窗口类函数详解[查找所有窗口、获取目标句柄的类名、获取窗口文本、获取当前活动窗口、通过窗口句柄获取线程ID、获取指定窗口位置]

    /// <summary>/// 查找所有窗口(只要是在进程里面的)/// 如果不限制类名或者标题使用null代替/// </summary>/// <param nam ...

  7. 从子窗口中获取父窗口的句柄例子

    HWND hTemp=::GetParent(this->GetSafeHwnd());//GetSafeHwnd()会返回当前窗口的句柄,GetParent(子句柄)这个函数将获得子句柄的父窗 ...

  8. 易语言调用API(FindWindowExA)获取窗口取句柄

    FindWindowExA和FindWindowA的不同,就是,FindWindowExA可以查找父窗口和子窗口的句柄,多了两个参数,功能更强大. 视频链接: 511遇见易语言模块API教程 API ...

  9. VC++的窗口句柄和窗口ID

    http://blog.sina.com.cn/s/blog_4cd5d2bb0100nb5d.html VC++的窗口句柄和窗口ID(2010-10-22 23:42:28) 句柄是窗口资源的标识, ...

最新文章

  1. jenkins~管道Pipeline里使用公用类库
  2. LIVE555再学习 -- 初识
  3. oracle10g备份导入
  4. 卡尔曼滤波器实例:进一步讨论自由落体运动
  5. (筆記) Continuous Assignment的幾個特色 (SOC) (Verilog)
  6. Ubuntu 18安装谷歌浏览器
  7. Java多线程讲解,超详细!可获取相关笔记
  8. 计算机科学与技术_080702,电子科学与技术(专业代码;080702)专业介绍与解读
  9. 使用matlab如何求卷积,利用MATLAB求解卷积的方法分类
  10. JavaScript打开新窗口的方法
  11. editplus5中文免费版
  12. PR卡点插件 Premiere自动卡点自动剪辑插件 音乐鼓点节拍插件BeatEdit v1.0.10.2+使用教程
  13. 永洪科技怎么样_「永洪科技」北京永洪商智科技有限公司怎么样? - 职友集
  14. 《响应式Web图形设计》一1.4 布置页面内容
  15. python时间索引_Python时间戳作为索引
  16. Linux 批量修改文件名(前缀或后缀)
  17. 离散傅里叶变换-DFT(FFT基础)
  18. 【ISAR成像定标方法(1)—转台目标的RD成像算法MATLAB仿真】
  19. oracle 抓包工具,【转】抓包工具Wireshark详解(抓取IOS中APP的请求)
  20. 番外10:使用ADS对射频功率放大器进行非线性测试2(使用带宽20MHz的64QAM信号进行ACLR、EVM、CCDF测试)

热门文章

  1. 常见几个排序源码及二分查找源码
  2. K8sAPI接口文档
  3. python毕业设计项目源码选题(4)企业公司网站系统毕业设计毕设作品开题报告开题答辩PPT
  4. 你的登录接口真的安全吗?
  5. 一个大牛对IT人士的忠告
  6. 靠2块钱月入4万:越朴素的方法,往往越挣钱
  7. 磨金石教育摄影技能干货分享|那些酷炫的照片是怎么拍出来的?
  8. 鸿蒙杀戮手机电脑版,鸿蒙杀戮单职业
  9. NYOJ 613免费馅饼
  10. idea中更换java版本