Alt Tab Win32 消息队列和 SetWinEventHook

yos*_*o78 5 c++ winapi message-queue visual-c++

我正在尝试Alt+Tab使用 Win Event Hook进行检测SetWinEventHook。然而Alt+Tab,即使我有消息泵(我在 Windows 10 上),钩子的回调也永远不会触发

Alt+Tab当我偶然发现这一系列帖子时,我想到了这样处理的想法:

Alt Tab 覆盖 Win32 标识符

SetWinEventHook 没有捕获任何事件

其中描述了使用 WinEventHook 来获取Alt+Tab消息(我不知道它在现代是否有效)。我发现Raymond Chen 的一篇文章详细介绍了它(但是它不再起作用了,我不知道为什么,但它应该起作用。)

Alt+Tab如何在事件回调中获取消息?

编辑:这是我的例子,模仿我大规模做的事情(小程序不起作用)并消除评论中的疑问。这是整个程序加上编译脚本,它显示了我正在尝试执行的操作,但根本不起作用(我做错了什么?上面的 Raymond Chen 程序似乎受其影响)。我使用的是 Windows 10

(编辑,我发现 EVENT_MIN 和 EVENT_MAX 在挂钩中给了我事件,但从来没有 EVENT_SYSTEM_SWITCHSTART 和 EVENT_SYSTEM_SWITCHEND 事件)

编译.bat:

@echo off
if not defined DevEnvDir (
    call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
)

if "%Platform%" neq "x64" (
    echo ERROR: Platform is not "x64" - previous bat call failed.
    exit /b 1
)

set FILES=main.cpp

set RELEASEFLAGS=/O2 /DMAINDEBUG=0
set DEBUGFLAGS=/Zi /DMAINDEBUG=1

set LIBS=kernel32.lib user32.lib gdi32.lib Winmm.lib

::Release
cl /nologo /W3 /GS- /Gs999999 %RELEASEFLAGS% %FILES% /Fe: AnnoyingSound.exe %LIBS% /link /incremental:no /opt:icf /opt:ref /subsystem:windows

::Debug
cl /nologo /W3 /GS- /Gs999999 %DEBUGFLAGS% %FILES% /FC /Fe: AnnoyingSoundDebug.exe %LIBS% /link /incremental:no /opt:icf /opt:ref /subsystem:console
Run Code Online (Sandbox Code Playgroud)

主要.cpp:

@echo off
if not defined DevEnvDir (
    call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
)

if "%Platform%" neq "x64" (
    echo ERROR: Platform is not "x64" - previous bat call failed.
    exit /b 1
)

set FILES=main.cpp

set RELEASEFLAGS=/O2 /DMAINDEBUG=0
set DEBUGFLAGS=/Zi /DMAINDEBUG=1

set LIBS=kernel32.lib user32.lib gdi32.lib Winmm.lib

::Release
cl /nologo /W3 /GS- /Gs999999 %RELEASEFLAGS% %FILES% /Fe: AnnoyingSound.exe %LIBS% /link /incremental:no /opt:icf /opt:ref /subsystem:windows

::Debug
cl /nologo /W3 /GS- /Gs999999 %DEBUGFLAGS% %FILES% /FC /Fe: AnnoyingSoundDebug.exe %LIBS% /link /incremental:no /opt:icf /opt:ref /subsystem:console
Run Code Online (Sandbox Code Playgroud)

对于我正在做的事情的背景:

我正在 DirectX12 中制作自己的渲染引擎,并且我正在手动执行所有 Win32 操作。我想做的一件事是Alt+Tab在全屏时最小化窗口。 (我听说 DirectX 在窗口顶部渲染,以便窗口最小化,但 DirectX 保持在窗口所在位置渲染,所以我需要处理Alt+Tab然后停止渲染(我不知道我是否属实) ,刚刚在论坛帖子中看到))。所以我需要一种检测和处理它的方法Alt+Tab。 (如果这不起作用,我可能会研究加速器,但我不知道这是否适用于 Alt + Tab)

浏览旧的 StackOverflow 内容,我找到了这两个链接,但所有示例要么已失效,要么不相关:

正确处理全屏 OpenGL 应用程序中的 Alt Tab

在全屏 Win32 OpenGL 中处理最小化