采用 SetWinEventHook 来监控 用户按下“alt+tab”。发现在win7下可以正常运行。但是win10,win11监控不到。
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
HWND g_hwndAltTab = nullptr;
void CALLBACK WinEventProc(
HWINEVENTHOOK hWinEventHook,
DWORD event,
HWND hwnd,
LONG idObject,
LONG idChild,
DWORD dwEventThread,
DWORD dwmsEventTime
)
{
PCTSTR pszSound = nullptr;
switch (event) {
case EVENT_SYSTEM_SWITCHSTART:
OutputDebugString(L"start");
if (!g_hwndAltTab) {
g_hwndAltTab = hwnd;
pszSound = L"C:\\Windows\\Media\\Speech on.wav";
}
break;
case EVENT_SYSTEM_SWITCHEND:
OutputDebugString(L"end");
if (g_hwndAltTab) {
g_hwndAltTab = nullptr;
pszSound = L"C:\\Windows\\Media\\Speech sleep.wav";
}
break;
}
if (pszSound) {
PlaySound(pszSound, nullptr, SND_FILENAME | SND_ASYNC);
}
}
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev,
LPSTR lpCmdLine, int nShowCmd)
{
HWINEVENTHOOK hWinEventHook = SetWinEventHook(
EVENT_SYSTEM_SWITCHSTART, EVENT_SYSTEM_SWITCHEND,
nullptr, WinEventProc, 0, 0,
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
if (hWinEventHook) {
MessageBox(nullptr, L"Close this window when sufficiently annoyed.",
L"Hello", MB_OK);
UnhookWinEvent(hWinEventHook);
}
return 0;
}
以上代码在win7是正常的,可以监控到用户按下 alt+tab.win10,win11都无法监控到 EVENT_SYSTEM_SWITCHSTART 这类消息。
注要是我的程序,需要在用户按下 alt+tab时候,要停止一些操作,以免有冲突。