[Windows 编程] 如何截获 Alt+Tab 事件

简介:
Windows 中 Alt + Tab 组合键被用来在各个程序之间切换。 因此,该键盘消息 (WM_KEYDOWN/UP) 是直接发给系统内核, 在应用程序中的消息循环中截获不到。
一个常见问题是,可是有的应用程序想在被Alt+TAB 切换到后台之间做点事情, 这时候该怎么办?
方案之一就是用底层的键盘钩子,截获整个系统的键盘输入。但这样做会导致一些效率以及稳定性问题。 
另外一个比较方便安全的方案就是用 Windows Accessbility API 的 SetWinEventHook 函数, 监听 EVENT_SYSTEM_SWITCHSTART 和 EVENT_SYSTEM_SWITCHEND 事件。
这2个事件就是对应用户按下Alt+Tab键 以及 松开 Alt+Tab键,下面是MSDN的解释:
EVENT_SYSTEM_SWITCHSTART The user has pressed ALT+TAB, which activates the switch window. This event is sent by the system, never by servers. The hwnd parameter of the WinEventProc callback function identifies the window to which the user is switching.
If only one application is running when the user presses ALT+TAB, the system sends an EVENT_SYSTEM_SWITCHEND event without a corresponding EVENT_SYSTEM_SWITCHSTART event.
 
EVENT_SYSTEM_SWITCHEND The user has released ALT+TAB. This event is sent by the system, never by servers. The hwnd parameter of the WinEventProc callback function identifies the window to which the user has switched.
If only one application is running when the user presses ALT+TAB, the system sends this event without a corresponding EVENT_SYSTEM_SWITCHSTART event.
 

示例代码:
view plaincopy to clipboardprint?
//安装Event Hook   
void InstallEventHook()   
{   
    g_hWinEventhook = ::SetWinEventHook(   
        EVENT_SYSTEM_SWITCHSTART , EVENT_SYSTEM_SWITCHEND,  //          NULL,                                          // Handle to DLL.   
        s_HandleWinEvent,             // The callback.   
        0, 0,              // Process and thread IDs of interest (0 = all)   
        WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); // Flags.   
  
}   
  
  
// 回调函数   
  
void CALLBACK s_HandleWinEvent(HWINEVENTHOOK hook, DWORD eventWin, HWND hwnd,    
                             LONG idObject, LONG idChild,    
                             DWORD dwEventThread, DWORD dwmsEventTime)   
  
{   
  
    switch (eventWin)   
    {   
    case EVENT_SYSTEM_SWITCHSTART:   
        TRACE0("[EVENT_SYSTEM_MENUSTART] "); // Alt +Tab 被按下   
        break;   
    case EVENT_SYSTEM_SWITCHEND:   
        TRACE0("[EVENT_SYSTEM_MENUEND] ");  // Alt +Tab 被松开   
        break;   
    }   
    TRACE1("hwnd=0x%.8x\n", hwnd);   
  
}

 

 本文转自 陈本峰 51CTO博客,原文链接:http://blog.51cto.com/wingeek/273996,如需转载请自行联系原作者

相关文章
|
3月前
|
消息中间件 C++ Windows
02 MFC - Windows 编程模型
02 MFC - Windows 编程模型
19 0
|
4月前
|
监控 编译器 API
[笔记]Windows核心编程《二十二》注入DLL和拦截API(一)
[笔记]Windows核心编程《二十二》注入DLL和拦截API
114 0
|
1月前
|
网络协议 Linux C语言
005.在Windows下编程让效率起飞
windows开发Linux方式: 先用编辑器编写源代码 然后进入Linux 系统,使用gcc编译器(后面会讲),对源代码进行编译运行。 熟练后推荐使用VS2019 开发Linux C++ 程序 将自己的Ip地址设为静态IP
27 1
|
2月前
|
人工智能 机器人 C#
Windows编程课设(C#)——基于WPF和.net的即时通讯系统(仿微信)
一款参考QQ、微信的即时通讯软件。采用CS结构,客户端基于.Net与WPF开发,服务端使用Java开发。
|
4月前
|
消息中间件 Ubuntu 编译器
Windows编程
Windows编程
27 0
|
4月前
|
开发框架 .NET C++
[笔记]Windows系统编程《九》Windows服务编程(二)
[笔记]Windows系统编程《九》Windows服务编程(二)
|
4月前
|
数据库 数据安全/隐私保护 C++
[笔记]Windows系统编程《九》Windows服务编程(一)
[笔记]Windows系统编程《九》Windows服务编程
|
4月前
|
安全 API Windows
[笔记]Windows核心编程《二十二》注入DLL和拦截API(三)
[笔记]Windows核心编程《二十二》注入DLL和拦截API(三)
103 0
|
4月前
|
消息中间件 编解码 安全
[笔记]Windows核心编程《二十二》注入DLL和拦截API(二)
[笔记]Windows核心编程《二十二》注入DLL和拦截API(二)
|
4月前
|
编译器 索引 Windows
[笔记]Windows核心编程《二十一》线程本地存储器TLS
[笔记]Windows核心编程《二十一》线程本地存储器TLS

相关产品

  • 云迁移中心