在编写DirectX应用程序时,显然需要支持用户暂停应用程序Alt- Tab以一种快速且无错误的方式.确保这一点的最佳做法是什么?需要解决的问题包括:
有趣的技巧和陷阱也很好听.
我将来自外部传感器(例如键盘)的事件映射到键盘快捷键,我想使用快速切换覆盖窗口(即Alt- Tab菜单")切换应用程序,但我想继续显示切换菜单直到应用程序被选中.
基本上,我在做什么是这样的:
if(notInSwitchMenu)
{ // Alt-Tab keystroke, but Alt remains pressed : the menu is still visible
Press(VK_MENU);
Press(VK_TAB);
Release(VK_TAB);
}
else
{
if(event1) //Tab keystroke : next app
{
Press(VK_TAB);
Release(VK_TAB) ;
}
else if(event2) //Shift-Tab keystroke : previous app
{
Press(VK_SHIFT);
Press(VK_TAB);
Release(VK_TAB);
Release(VK_SHIFT)
}
else if(event3) // we get out of the menu : the selected app has the focus.
{
Release(VK_MENU);
}
}
Run Code Online (Sandbox Code Playgroud)
Press和Release只需使用正确的属性调用SendInput.
我的问题是我不知道一个可靠的方法来确定用户当前是否在Alt- Tab程序列表中.有谁知道如何使用Win32 API识别Alt-Tab覆盖菜单?
这是这个问题的后续: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)