我正在尝试Alt+Tab使用 Win Event Hook进行检测SetWinEventHook。然而Alt+Tab,即使我有消息泵(我在 Windows 10 上),钩子的回调也永远不会触发
Alt+Tab当我偶然发现这一系列帖子时,我想到了这样处理的想法:
其中描述了使用 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 …Run Code Online (Sandbox Code Playgroud) 这是这个问题的后续:Alt Tab Overlay Win32 identificator。
我尝试使用 Winuser API 中的 SetWinEventHook 函数捕捉 alt-tab 切换菜单打开(和退出)的时刻。但是,该钩子不会捕获任何事件(例如最小化窗口),因此不会调用 HandleWinEvent。
下面的代码很大程度上受到MSDN页面上提供的代码的启发
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
#ifndef WINVER
#define WINVER 0x0501
#endif
#include "conio.h"
#include <windows.h>
#include <iostream>
// Global variable.
HWINEVENTHOOK g_hook;
// Prototype
void HandleWinEvent(HWINEVENTHOOK , DWORD , HWND ,
LONG , LONG ,
DWORD , DWORD );
// Initializes COM and sets up the event hook.
//
void InitializeMSAA()
{
CoInitialize(NULL);
g_hook = SetWinEventHook(
EVENT_MIN ,EVENT_MAX, // …Run Code Online (Sandbox Code Playgroud) 添加信息:
当我在 Windows 7 中使用 .exe 文件时,一切都会正常工作。它在 Windows 10 中不起作用。我不明白为什么。
原帖:
也许我只是需要更多咖啡......但我正在尝试编写一个小程序来监听 Alt+Tab 事件。因此,我添加了SetWinEventHook来监听EVENT_SYSTEM_SWITCHSTART和EVENT_SYSTEM_SWITCHEND。因为这就是我认为根据 MSDN 执行此操作的方法:SetWinEventHook、WinEventProc 回调、Event 常量
由于某种原因,这些事件似乎从未发生过。但更可能的是我错过了一些东西。
当我没有让它在我的实际应用程序中工作时,我创建了这个小应用程序来测试它。它也在那里不起作用。但其他事件确实有效。EVENT_SYSTEM_FOREGROUND、EVENT_OBJECT_CREATE和 EVENT_OBJECT_DESTROY一直在发生。
我的小型测试应用程序的代码:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
namespace
{
HWINEVENTHOOK sTabHook;
HWINEVENTHOOK sFocusHook;
HWINEVENTHOOK sCreateHook;
}
void CALLBACK tabEventProc(HWINEVENTHOOK hook, DWORD event, HWND hwnd, LONG idObject, LONG idChild, DWORD dwEventThread, DWORD dwmsEventTime)
{
printf("Never happens!");
if (EVENT_SYSTEM_SWITCHSTART == event)
{
printf("Tab start\n");
} …Run Code Online (Sandbox Code Playgroud)