最近遇到一个比较怪的需求,需要在程序里加一个按钮,用户点击这个按钮的时候,相当按下了一下ALT+TAB然后松开TAB,既切换到下一个任务。
最简单的办法,用Windows API SendInput来模拟键盘操作:
这个办法比较直接,但是某些比较2的安全软件会把SendInput直接拦截掉,大爷的。对于不知道ALT+TAB的用户,不能指望他懂得白名单之类的东西。
于是试着用窗口枚举来实现:
HWND hWnd = GetNextWindow( hWinMain, GW_HWNDNEXT );
while (
IsWindowVisible(hWnd) == FALSE ||
GetWindow( hWnd, GW_OWNER ) != NULL ||
GetParent( hWnd ) != NULL
)
{
hWnd = GetNextWindow( hWnd, GW_HWNDNEXT );
}
dwExStyle = GetWindowLong(hWinMain,GWL_EXSTYLE);
if ( dwExStyle & WS_EX_TOPMOST )
{
SetWindowPos(hWinMain, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
hWnd = GetNextWindow( hWinMain, GW_HWNDNEXT );
while (
IsWindowVisible(hWnd) == FALSE ||
GetWindow( hWnd, GW_OWNER ) != NULL ||
GetParent( hWnd ) != NULL
)
{
hWnd = GetNextWindow( hWnd, GW_HWNDNEXT );
}
SetWindowPos(hWinMain, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
}
if ( hWnd != NULL )
{
BringWindowToTop(hWnd);
if ( IsIconic(hWnd) )
{
ShowWindow(hWnd,SW_RESTORE);
}
}
可能和ALT+TAB不完全一样,不过不会再被拦截了。