当前位置: 首页 > news >正文

[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.

示例代码:

//安装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); }

相关文章:

  • 下午调试的几个关于weblogic连接池的问题
  • Asp.Net Set Http Timeout
  • 现实与理想(中国台湾清华大学教授彭明辉)
  • c# 用反射获得静态类成员
  • Sql Server Table 中identity 重置...
  • Asp.Net 中使用HttpModule 做Session验证
  • Asp.Net MVC4系列---基础篇(4)
  • IE8 正式版官方下载链接
  • IE8 视频
  • [Web开发] 快速修复网页在IE8 下的显示兼容问题
  • 用手机连pc localhost 学习,调试网站
  • [Web开发] Web开发者必读:《IE8 开发技术概述》
  • Web Server IIS Asp.Net Http Module 不工作
  • SqlServer中decimal(numeric )、float 和 real 数据类型的区别
  • 说说“315曝光中移动”的“阴谋论”
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • angular2开源库收集
  • HTML中设置input等文本框为不可操作
  • input实现文字超出省略号功能
  • JavaScript HTML DOM
  • Kibana配置logstash,报表一体化
  • Netty 4.1 源代码学习:线程模型
  • PHP变量
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python学习之路13-记分
  • XForms - 更强大的Form
  • 翻译:Hystrix - How To Use
  • 关于extract.autodesk.io的一些说明
  • 使用 @font-face
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 小李飞刀:SQL题目刷起来!
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #{} 和 ${}区别
  • #Z0458. 树的中心2
  • #前后端分离# 头条发布系统
  • (11)MSP430F5529 定时器B
  • (day6) 319. 灯泡开关
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (分布式缓存)Redis哨兵
  • (算法设计与分析)第一章算法概述-习题
  • (转)Sublime Text3配置Lua运行环境
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NetCore 如何动态路由
  • .Net环境下的缓存技术介绍
  • /*在DataTable中更新、删除数据*/
  • @Pointcut 使用
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • [<事务专题>]
  • [20180224]expdp query 写法问题.txt