本文将介绍一个未公开的Win32 API函数:GetTaskmanWindow。利用它对Windows的任务栏进行操作。

这个函数返回拥有任务栏button的窗体句柄。

在微软的MSDN文档中。对任务栏是这样描写叙述的:"……Windows界面包括一个特殊的应用程序桌面工具栏,叫做任务栏。任务栏能够用于在打开的不同窗体之间进行切换,以及启动新的应用程序……。任务栏包括有開始菜单、任务栏button、快捷菜单和状态显示区……"。可惜在Win32 API的正式问其中没有能存取任务栏的函数。因此我们必须使用未公开的Win32 API函数。

以下是GetTaskmanWindow的原型:

  1. //方法1. 获取任务栏句柄
  2. //说明:不过显示已启动应用程序的部分,不包含"開始菜单"、"语言区"、"托盘区"、"时钟区"和"显示桌面"
  3. typedef HWND (WINAPI *PROCGETTASKMANWND)(void);
  4. PROCGETTASKMANWND GetTaskmanWindow;
  5.  
  6. void main(int argc, char* argv[])
  7. {
  8. HMODULE hUser32 = GetModuleHandle("user32");
  9. if (!hUser32)
  10. {
  11. return;
  12. }
  13.  
  14. GetTaskmanWindow = (PROCGETTASKMANWND)GetProcAddress(hUser32,"GetTaskmanWindow");
  15. if (!GetTaskmanWindow)
  16. {
  17. return;
  18. }
  19.  
  20. HWND hWnd = GetTaskmanWindow();
  21. if (!hWnd)
  22. {
  23. return;
  24. }
  25. }

方法2:

  1. (1)获取桌面窗体
  2. (2)遍历桌面的子窗体
  3. (3)推断类名为Shell_TrayWnd则为任务栏
  4. (4)然后再遍历任务栏的子窗体找到你要的窗体
  5.  
  6. HWND g_hWndShell_TrayWnd = 0;
  7.  
  8. //先遍历桌面的子窗体,得到任务栏窗体句柄
  9. BOOL CALLBACK EnumChildProc1(HWND hWnd, LPARAM lParam)
  10. {
  11. //成功返回值为复制到缓冲的字符数,失败返回0
  12. TCHAR szText[33] = { 0 };
  13. if (0 == GetClassName(hWnd, szText, 32))
  14. {
  15. return TRUE;
  16. }
  17.  
  18. //"Shell_TrayWnd"为任务栏窗体的句柄,可通过捕捉工具查看
  19. if (lstrcmp(szText, _T("Shell_TrayWnd")) == 0)
  20. {
  21. g_hWndShell_TrayWnd = hWnd;
  22. return FALSE;
  23. }
  24. return TRUE;
  25. }
  26.  
  27. //再遍历任务栏上的子窗体,得到想要的子窗体句柄或标题
  28. BOOL CALLBACK EnumChildProc2(HWND hWnd, LPARAM lParam)
  29. {
  30. //[注意]得到的窗体类名肯定不为空,但窗体标题可能为空
  31. TCHAR szClassName[MAX_PATH] = { 0 };
  32. GetClassName(hWnd, szClassName, MAX_PATH);
  33.  
  34. TCHAR szTitleName[MAX_PATH] = { 0 };
  35. GetWindowText(hWnd, szTitleName, MAX_PATH);
  36.  
  37. //OutputDebugString(szClassName);
  38. //OutputDebugString("\r\n");
  39.  
  40. //比如:得到类名结果例如以下:
  41. //说明:获取任务栏上系统窗体非常全面,但获取其它用户应用程序窗体不全面
  42. // TrayNotifyWnd
  43. // Button //"開始button"的窗体类名称
  44. // MSTaskListWClass //显示"任务栏图标"的窗体类名称
  45. // CiceroUIWndFrame //右边的显示"输入法"窗体类名称
  46. // ToolbarWindow32 //右边的显示"托盘图标"窗体类名称
  47. // TrayClockWClass //右边显示"日期时间"的窗体类名称
  48. // TrayShowDesktopButtonWClass //最右边的"显示桌面"的窗体类名称
  49. // Edit //任务栏中的"地址栏"窗体类名称
  50. // ... ...
  51. // SysPager //任务栏上其它应用程序窗体类名称
  52. // ReBarWindow32
  53. // MSTaskSwWClass
  54. // Address Band Root
  55. // msctls_progress32
  56. // ComboBoxEx32
  57.  
  58. return TRUE;
  59. }
  60.  
  61. int _tmain(int argc, _TCHAR* argv[])
  62. {
  63. //先枚举桌面全部子窗体,匹配类名得到任务栏窗体句柄
  64. //回调函数返回true,则枚举继续直到枚举完毕;假设返回false,则中止枚举.
  65. //或者不用枚举,直接通过FindWindow("Shell_TrayWnd", NULL)一步得到任务栏窗体句柄
  66. EnumChildWindows(::GetDesktopWindow(), EnumChildProc1, 0);
  67.  
  68. //得到任务栏句柄后,再枚举任务栏上全部子窗体句柄
  69. if (g_hWndShell_TrayWnd)
  70. {
  71. EnumChildWindows(g_hWndShell_TrayWnd, EnumChildProc2, 0);
  72. }
  73.  
  74. return 0;
  75. }

方法3:

  1. //该函数是一个与EnumWindows或EnumDesktopWindows一起使用的应用程序定义的回调函数,它接收顶层窗体句柄.
  2. //參数hwnd: 顶层窗体句柄.
  3. //參数lParam: 指定在EnumWindows或EnumDesktopWindows中的应用程序定义值.
  4. //返回值:为继续列表,回调函数必须返回TRUE;若停止列表,它必须返回FALSE.
  5. BOOL CALLBACK EnumTaskbarWnds(HWND hwnd, LPARAM lParam)
  6. {
  7. //滤掉不在任务栏显示的窗体
  8. //參数GW_OWNER: 返回的句柄标识了是指定窗体的全部者窗体(假设存在).
  9. //返回值: 成功返回值为窗体句柄;假设与指定窗体有特定关系的窗体不存在,则返回值为NULL.
  10. if (!GetWindow(hwnd, GW_OWNER) && IsWindowVisible(hwnd))
  11. {
  12. TCHAR szClassName[MAX_PATH] = { 0 };
  13. GetClassName(hwnd, szClassName, MAX_PATH);
  14.  
  15. TCHAR szTitleName[MAX_PATH] = { 0 };
  16. GetWindowText(hwnd, szTitleName, MAX_PATH);
  17.  
  18. if (strcmp(szClassName, "Shell_TrayWnd") != 0 //滤掉任务栏本身
  19. && strcmp(szClassName, "Progman") != 0) //滤掉桌面
  20. {
  21. OutputDebugString(szClassName);
  22. OutputDebugString("\r\n");
  23.  
  24. //比如: 得到类名结果例如以下:
  25. //说明: 获取任务栏上应用程序非常全,但获取系统的不全(入開始菜单button,托盘窗体,时间窗体等等)
  26. //HwndWrapper[DefaultDomain;;1917a89e-ad21-4281-974c-a495d1aa6534] //VisualStudio窗体
  27. //HwndWrapper[DefaultDomain;;d98f9c47-8d9c-42bd-87c9-9c924f9823be]
  28. //ConsoleWindowClass //控制台窗体
  29. //Alternate Owner
  30. //Alternate Owner
  31. //IEFrame //浏览器窗体
  32. //TXGuiFoundation //QQ聊天窗体
  33. //Afx:00400000:8:00010003:00000000:00320807 //UEStudio
  34. //dbgviewClass //DebugView
  35. //EVERYTHING //Everything
  36. //Alternate Owner
  37. //Alternate Owner
  38. //Alternate Owner
  39. //Alternate Owner
  40. //Internet Explorer_Hidden
  41. }
  42. }
  43.  
  44. return TRUE;
  45. }
  46.  
  47. int _tmain(int argc, _TCHAR* argv[])
  48. {
  49. //该函数枚举全部屏幕上的顶层窗体,并将窗体句柄传送给应用程序定义的回调函数.
  50. //參数lPararm:指定一个传递给回调函数的应用程序定义值.
  51. //返回值:假设函数成功,返回值为非零;假设函数失败,返回值为零.
  52. EnumWindows(EnumTaskbarWnds, NULL);
  53.  
  54. return 0;
  55. }

VC 获取任务栏窗体的句柄的更多相关文章

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

    在Windows中,句柄是一个系统内部数据结构的引用. 比如当你操作一个窗体.或说是一个Delphi窗体时,系统会给你一个该窗体的句柄,系统会通知你:你正在操作142号窗体.就此你的应用程序就能要求系 ...

  2. VC获取屏幕分辨率及大小相关(转)

    vc得到屏幕的当前分辨率方法: 1.Windows API调用 int width = GetSystemMetrics ( SM_CXSCREEN );  int height= GetSystem ...

  3. MFC中获取各个窗口之间的句柄或者指针对象的方法

    MFC在非常多的对话框操作中,我们常常要用到在一个对话框中调用还有一个对话框的函数或变量.能够用例如以下方法来解决.    HWND hWnd=::FindWindow(NULL,_T("S ...

  4. WindowFromPoint -- 获得包括指定点的窗体的句柄

     WindowFromPoint 函数功能: 该函数获得包括指定点的窗体的句柄. 函数原型: HWND WindowFromPoint(POINT Point): 參数: Point:指定一个被检 ...

  5. pywin32 获取 windows 的窗体内文本框的内容

    用 spy++去确认找到了文本框的句柄了. 用函数 win32gui.SendMessage 获取不了文本框的文本内容,用 str 类型的参数接收获取的内容的话没有获取到东西,而用 PyBuffer ...

  6. VC++获取IDC_EDIT的7种方法

    VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...

  7. vc 获取当前时间 (zhuan)

    vc 获取当前时间(2010-02-10 11:34:32) http://wenku.baidu.com/view/6ade96d049649b6648d7475e.html 1.使用CTime类 ...

  8. 转:VC++获取屏幕大小第一篇 像素大小GetSystemMetrics

    VC++获取屏幕大小第一篇 像素大小 GetSystemMetrics>和<VC++获取屏幕大小第二篇物理大小GetDeviceCaps 上>和<VC++获取屏幕大小第三篇物理 ...

  9. VC 获取指定文件夹路径的方法小结

    VC获取指定文件夹路径 flyfish  2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath( ...

随机推荐

  1. vscode常好用的插件以及几个快捷操作

    使用方法,可以在官网中搜索需要的插件或者在VsCode的“”扩展“”中搜索需要的插件添加方法使用Ctrl+P, 输入 ext install xxxx ,搜索要安装的插件,点击安装按钮即可(各取所需插 ...

  2. 树莓派安装CentOS

    1.下载并安装,这里使用的是 centos系统地址:http://mirror.centos.org/altarch/7/isos/armhfp/ 下载CentOS-Userland-7-armv7h ...

  3. HTML `capture` 属性

    file 类型的 <input> 除了调起系统的文件选择框外,还可通过指定 capture 属性来现场拍照或录制.配合 accept 属性,可实现更加便捷的文件获取. 比如想要录制一段视频 ...

  4. ThinkPHP---框架介绍

    (1)什么是框架? ①框架是一堆包含了常量.方法和类等代码集合: ②半成品应用,只包含了项目开发时的底层架构,并不包含业务逻辑: ③包含一些设计模式,例如单例模式,工厂模式,AR(Active Rec ...

  5. jsp中的basePath,获取应用的路径

    1 2 3 4 5 String path = request.getContextPath();      String basePath = request.getScheme()+": ...

  6. css 实现鼠标滑过流光效果

    来划我啊 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  7. html option选中 回显 取值

    1.html <select class="form-control" id="sex"> <option value="-1&qu ...

  8. Ubuntu notes

    ubuntu notes Table of Contents 1. backup data 2. Basics Ubuntu 3. Install, uninstall packages 4. Bas ...

  9. 基于 Ubuntu 搭建 FTP 文件服务

    搭建 FTP 文件服务 安装并启动 FTP 服务 任务时间:5min ~ 10min 安装 VSFTPD 使用 apt-get 安装 vsftpd: sudo apt-get install vsft ...

  10. Android NumberProgressBar:动态移动显示百分比进度的进度条

     Android NumberProgressBar:动态移动显示百分比进度的进度条 NumberProgressBar是github上一个开源项目,其项目主页是:https://github.c ...