相关疑难解决方法(0)

Alt Tab Win32 消息队列和 SetWinEventHook

我正在尝试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 …
Run Code Online (Sandbox Code Playgroud)

c++ winapi message-queue visual-c++

5
推荐指数
0
解决办法
757
查看次数

SetWinEventHook 没有捕获任何事件

这是这个问题的后续: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)

c++ winapi event-handling event-hooking

4
推荐指数
1
解决办法
4636
查看次数

系统事件 EVENT_SYSTEM_SWITCHSTART 和 EVENT_SYSTEM_SWITCHEND 在 Windows 7 中有效,但在 Windows 10 中无效

添加信息:
当我在 Windows 7 中使用 .exe 文件时,一切都会正常工作。它在 Windows 10 中不起作用。我不明白为什么。

原帖:
也许我只是需要更多咖啡......但我正在尝试编写一个小程序来监听 Alt+Tab 事件。因此,我添加了SetWinEventHook来监听EVENT_SYSTEM_SWITCHSTARTEVENT_SYSTEM_SWITCHEND。因为这就是我认为根据 MSDN 执行此操作的方法:SetWinEventHookWinEventProc 回调Event 常量

由于某种原因,这些事件似乎从未发生过。但更可能的是我错过了一些东西。

当我没有让它在我的实际应用程序中工作时,我创建了这个小应用程序来测试它。它也在那里不起作用。但其他事件确实有效。EVENT_SYSTEM_FOREGROUNDEVENT_OBJECT_CREATEEVENT_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)

c++ events alt-tab windows-10 visual-studio-2017

4
推荐指数
1
解决办法
901
查看次数