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