码迷,mamicode.com
首页 > 其他好文 > 详细

VC 获取任务栏窗口的句柄

时间:2015-07-18 18:41:13      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:



本文将介绍一个未公开的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
}


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

VC 获取任务栏窗口的句柄

标签:

原文地址:http://blog.csdn.net/jiangqin115/article/details/46943829

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!