标签:
本文将介绍一个未公开的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
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/jiangqin115/article/details/46943829