VC 获取任务栏窗口的句柄



本文将介绍一个未公开的Win32 API函数:GetTaskmanWindow,利用它对Windows的任务栏进行操作。这个函数返回拥有任务栏按钮的窗口句柄。在微软的MSDN文档中,对任务栏是这样描述的:"……Windows界面包含一个特殊的应用程序桌面工具栏,叫做任务栏。任务栏可以用于在打开的不同窗口之间进行切换,以及启动新的应用程序……。任务栏包含有开始菜单、任务栏按钮、快捷菜单和状态显示区……"。可惜在Win32 API的正式问当中没有能存取任务栏的函数。因此我们必须使用未公开的Win32 API函数。

下面是GetTaskmanWindow的原型:

typedef HWND (WINAPI *PROCGETTASKMANWND)(void);
PROCGETTASKMANWND GetTaskmanWindow;

void main(int argc, char* argv[])
{
  if (argc<2)
  {
     printf("Usage:/n/ngetaskmanwnd.exe S|H/n");
     return;
  }

  HMODULE hUser32 = GetModuleHandle("user32");
  if (!hUser32)
  {
      return;
  }

  GetTaskmanWindow = (PROCGETTASKMANWND)GetProcAddress(hUser32,"GetTaskmanWindow");
  if (!GetTaskmanWindow)
  {
      return;
  }

  HWND hWnd = GetTaskmanWindow();
  if (!hWnd)
  {
      return;
  }

  if (*argv[1]=='H' || *argv[1]=='h')
  {
      ShowWindow(GetParent(hWnd),SW_HIDE);
  }
  else
  {
      ShowWindow(GetParent(hWnd),SW_SHOW);
  }
}

方法2:

HWND GetDesktopWindow(VOID);

BOOL EnumChildWindows(          HWND hWndParent,

    WNDENUMPROC lpEnumFunc,

    LPARAM lParam

);

int GetClassName(          HWND hWnd,

    LPTSTR lpClassName,

    int nMaxCount

);

1)获取桌面窗口

2)遍历桌面的子窗口

3)判断类名为Shell_TrayWnd则为任务栏

4)然后再遍历任务栏的子窗口找到你要的窗口

#include <windows.h>
#include <stdio.h>

BOOL CALLBACK EnumTaskbarWnds( HWND hwnd, LPARAM lParam )
{
    char szClass[256];

    if( !GetWindow( hwnd, GW_OWNER ) && IsWindowVisible( hwnd ) ) // 滤掉不在任务栏显示的窗口
        {
        GetClassName( hwnd, szClass, 256 );
        if( strcmp( szClass, "Shell_TrayWnd" ) != 0 // 滤掉任务栏本身
            && strcmp( szClass, "Progman" ) != 0 ) // 滤掉桌面
            {

            //这就是你想要的窗口了。

            char szTitle[256];
            GetWindowText( hwnd, szTitle, 256 );
            printf( "%s | %s\n", szTitle, szClass );

            }//end if
        }//end if

    return TRUE;
}

int main()
{
    EnumWindows( EnumTaskbarWnds, NULL );

    return 0;
}

方法3:

HWND g_hWndShell_TrayWnd = 0;

BOOL CALLBACK EnumChildProc1( HWND hWnd, LPARAM lParam )
{
    TCHAR szText[33] = { 0 };
    if ( 0 == GetClassName( hWnd, szText, 32 ) )
        return TRUE;        

    if ( lstrcmp( szText, _T("Shell_TrayWnd") ) == 0 )
    {
        g_hWndShell_TrayWnd = hWnd;
        return FALSE;
    }
    return TRUE;
}

BOOL CALLBACK EnumChildProc2( HWND hWnd, LPARAM lParam )
{
    TCHAR szText[33] = { 0 };

    GetWindowText(hWnd, szText, 32);

    MessageBox(NULL, szText, _T("Caption"), MB_OK);

    return TRUE;
}

VOID Test()
{
    EnumChildWindows(::GetDesktopWindow(), EnumChildProc1,0); // Enum Desktop's child windows

    if ( g_hWndShell_TrayWnd )
        EnumChildWindows( g_hWndShell_TrayWnd, EnumChildProc2, 0 ); // Enum tray's child windows
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-05 23:26:58

VC 获取任务栏窗口的句柄的相关文章

VC 获取控制台窗口的句柄(hWnd)

在Windows中,句柄是一个系统内部数据结构的引用.例如当你操作一个窗口,或说是一个Delphi窗体时,系统会给你一个该窗口的句柄,系统会通知你:你正在操作142号窗口,就此你的应用程序就能要求系统对142号窗口进行操作--移动窗口.改变窗口大小.把窗口极小化为图标等.实际上许多Windows API函数把句柄作为它的第一个参数,如GDI(图形设备接口)句柄.菜单句柄.实例句柄.位图句柄等,不仅仅局限于窗口函数.换句话说,句柄是一种内部代码,通过它能引用受系统控制的特殊元素,如窗口.位图.图标

Spy++获取子窗口的句柄

http://blog.csdn.net/pipisorry/article/details/46559139 问题: 如果要搜索的外部程序的窗口标题比较容易得到[],问题是比较简单的.如果窗口的标题不固定或者根本就没有标题,怎么得到窗口的类呢? Introduction Spy++是微软出品的用来获取Window窗口信息的一个小工具.Spy++中,最常用的一个功能,就是识别窗口.获取当前鼠标位置: 获取位于指定位置的窗口句柄: 获取窗口类别: 获取窗口内容或标题. Spy++ (SPYXX.E

获取窗口实例句柄

方法一 GetWindowLong(hwnd, GWL_HINSTANCE); 获取该窗口句柄做用的实例句柄? 方法二 WM_CREATE? lpcs = (LPCREATESTRUCT) lParam; lpcs->hInstance;获取窗口实例句柄,布布扣,bubuko.com

WindowFromPoint -- 获得包含指定点的窗口的句柄

 WindowFromPoint 函数功能: 该函数获得包含指定点的窗口的句柄. 函数原型: HWND WindowFromPoint(POINT Point): 参数: Point:指定一个被检测的点的POINT结构. 返回值: 返回值为包含该点的窗口的句柄.如果包含指定点的窗口不存在,返回值为NULL.如果该点在静态文本控件之上,返回值是在该静态文本控件的下面的窗口的句柄. 备注: WindowFromPoint函数不获取隐藏或禁止的窗口句柄,即使点在该窗口内.应用程序应该使用Child

VC实现A进程窗口嵌入到B进程窗口中显示的方法

这篇文章主要介绍了VC实现A进程窗口嵌入到B进程窗口中显示的方法,对于理解windows程序运行原理的进程问题有一定的帮助,需要的朋友可以参考下 本文通过一个Demo示例讲述把A应用程序嵌入到B应用程序中显示的方法. 主要代码如下: <span style="font-size:12px;font-weight: normal;">//在B应用启动时创建A进程 CreateProcess(_T("A.exe"),NULL,NULL,NULL,FALSE,

使用XCB编写X Window程序(05):使用异步的方式和X Server通讯及获取和设置窗口的属性

在前面的例子中,我们从来没有关心过调用XCB函数时,该函数和X Server的通讯是同步的还是异步的.因为在前面的例子中,我们基本上不关心XCB函数的返回值,只有在上一篇中,由于某些操作需要关心它们是否成功(比如是否成功打开字体.是否成功创建GC等),才涉及到XCB函数的返回值. 在这一篇中会更进一步,因为是获取窗口的属性,所以肯定要关注从X Server获取的数据,这时,将会涉及到XCB函数同X Server的通讯是同步的还是异步的.什么是同步?就是说调用一个函数向X Server发出一个请求

VC++获取屏幕大小第二篇 物理大小GetDeviceCaps 上

分享一下我老师大神的人工智能教程吧.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net 上一篇<VC++获取屏幕大小第一篇像素大小GetSystemMetrics>中介绍了使用GetSystemMetrics函数来获取屏幕的像素大小,本篇将介绍使用GetDeviceCaps函数来获取屏幕的物理大小.下面来看看GetDeviceCaps函数的用法: 函数功能:用于得到被定义的系统数据或者系统配置信息 函数原型:获取一些

VC++ 获取当前系统下存储设备的Physical ID

一   起因: 因为近期需要写一个获取磁盘SMART数值的Windows 工具,研究了下相关文档,发现后续执行的所有DeviceIocontrol函数,都要先获取设备的物理编号,physicalX.记录下我查到的方法. 执行环境VS2019.  二  过程: 1. SetupDiGetClassDevs ()获取指向磁盘类型设备的信息集合指针 HDEVINFO. 2. SetupDiEnumDeviceInterfaces() 通过上一步获取的HDEVINFO,从0开始逐一枚举磁盘类设备是否存在

第一章 Windows程序内部运行机制(2)窗口和句柄

窗口是Windows应用程序中非常重要的元素.一个Windows应用程序至少有一个主窗口.窗口是Windows应用程序和用户进行交互的接口. 窗口通常包含标题栏.菜单栏.系统菜单.最小化框.最大化框.可调边框和滚动条. 窗口分为客户区和非客户区.应用程序通常在客户区中显示文字或绘制图形.标题栏.菜单栏.系统菜单.最小最大化框.可调边框统称为非客户区.非客户区主要由Windows系统来管理.应用程序主要管理客户区和外观及操作. 桌面也是一个窗口,称为桌面窗口,由windows系统创建和管理. 窗口