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

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

在微软的MSDN文档中。对任务栏是这样描写叙述的:"……Windows界面包括一个特殊的应用程序桌面工具栏,叫做任务栏。任务栏能够用于在打开的不同窗体之间进行切换,以及启动新的应用程序……。任务栏包括有開始菜单、任务栏button、快捷菜单和状态显示区……"。可惜在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)
{
//成功返回值为复制到缓冲的字符数,失败返回0
TCHAR 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 //"開始button"的窗体类名称
// MSTaskListWClass //显示"任务栏图标"的窗体类名称
// CiceroUIWndFrame //右边的显示"输入法"窗体类名称
// ToolbarWindow32 //右边的显示"托盘图标"窗体类名称
// TrayClockWClass //右边显示"日期时间"的窗体类名称
// TrayShowDesktopButtonWClass //最右边的"显示桌面"的窗体类名称
// Edit //任务栏中的"地址栏"窗体类名称
// ... ...
// SysPager //任务栏上其它应用程序窗体类名称
// ReBarWindow32
// MSTaskSwWClass
// Address Band Root
// msctls_progress32
// ComboBoxEx32 return 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"); //比如: 得到类名结果例如以下:
//说明: 获取任务栏上应用程序非常全,但获取系统的不全(入開始菜单button,托盘窗体,时间窗体等等)
//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 获取控制台窗体的句柄(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. mybatis 关联查询

    1.关联的两个实体类 外部类 parent public class Parent{ private String parentId; private String parentName; priva ...

  2. 循环插入记录,id每次加1

    sql语句写法: begin for i in 1 .. 100 loop insert into table_name values(....); end loop; commit; end; 例子 ...

  3. Hue - Error loading MySQLdb module: libmysqlclient.so.20: cannot open shared object file: No such file or

    解决下面两点异常 >> 1. Hue页面 点击DB 查询时弹出: Error loading MySQLdb module: libmysqlclient.so.20: cannot op ...

  4. JVM GC调优一则–增大Eden Space提高性能

    缘起 线上有Tomcat升级到7.0.52版,然后有应用的JVM FullGC变频繁,在高峰期socket连接数,Cpu使用率都暴增. 思路 思路是Tomcat本身的代码应该是没有问题的,有问题的可能 ...

  5. 从Element.getElementsByTagName方法说起

    一.getElementsByTagName方法: 我们先看几个解释:1)W3C:getElementsByTagName() 方法可返回带有指定标签名的对象的集合.没有说明返回值的具体类型.2)菜鸟 ...

  6. 第三节:执行一些EF的增删改查

    针对两表操作 一丶增加 #region 05-增加操作 /// <summary> /// 05-增加操作 /// </summary> /// <param name= ...

  7. Android studio开发-第一个应用

    Android studio开发-第一个应用 上效果图 1.先创建布局文件 firstbutton.xml 代码 <?xml version="1.0" encoding=& ...

  8. HTML5大数据可视化效果(一)彩虹爆炸图

    前言 25年过去了,Brooks博士著名的“没有银弹”的论断依旧没有被打破.HTML5也是一样.但这并不妨碍HTML5是一个越来越有威力的“炸蛋”:发展迅速.势不可挡.随着HTML5技术的普及,用HT ...

  9. TWaver MONO Design中动画的导出与播放

    使用过MONO编辑器的朋友都应该了解MONO中支持一些动画的设置,比如开门,开窗,弹出设备,旋转场景,镜头巡航等.但如何将这些动画应用到自己的场景中呢?比如我们在编辑器中给机柜定义了动画,怎样让做好的 ...

  10. 17Aspectij

    17Aspectij-2018/07/31 1.Aspectj基于xml 前置通知 method : 通知,及方法名 pointcut :切入点表达式,此表达式只能当前通知使用. pointcut-r ...