[Windows 编程] 如何截获 Alt+Tab 事件
2009-03-19 09:01
302 查看
Windows 中 Alt + Tab 组合键被用来在各个程序之间切换。 因此,该键盘消息 (WM_KEYDOWN/UP) 是直接发给系统内核, 在应用程序中的消息循环中截获不到。
一个常见问题是,可是有的应用程序想在被Alt+TAB 切换到后台之间做点事情, 这时候该怎么办?
方案之一就是用底层的键盘钩子,截获整个系统的键盘输入。但这样做会导致一些效率以及稳定性问题。
另外一个比较方便安全的方案就是用 Windows Accessbility API 的 SetWinEventHook 函数, 监听 EVENT_SYSTEM_SWITCHSTART 和 EVENT_SYSTEM_SWITCHEND 事件。
这2个事件就是对应用户按下Alt+Tab键 以及 松开 Alt+Tab键,下面是MSDN的解释:
示例代码:
一个常见问题是,可是有的应用程序想在被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); }
相关文章推荐
- [Windows 编程] 如何截获 Alt+Tab 事件
- [Windows 编程] 如何截获 Alt+Tab 事件
- 如何截获 Alt+Tab 事件
- Windows-核心编程-09-如何用内核对象进行线程同步-事件内核对象
- 如何在一个控件中使Tab键作为一般的输入键来触发KeyDown,KeyUp事件呢?
- 右键点击修改Grid的单列值,及修改全表的值,还有相同点击事件的代码简化,及如何双击关闭一个tabsheet
- 《Java 编程技巧1001条》第421条:如何不处理事件
- 如何在Windows编程中快速定位BUG
- Windows编程-处理键盘事件(2)
- windows核心编程 如何等待超过64 kernal object
- Windows XP系统中如何屏蔽 Ctrl+Alt+Del、Alt+Tab以及Ctrl+Esc键序列
- [Windows编程] 如何判断操作系统是64位还是32位
- 如何:订阅和取消订阅事件(C# 编程指南)
- Windows窗体编程基础学习:更改TabControl 的外观(如qq用的)
- Windows编程 基本资源的使用 如何在窗口中输出一些简单的文本
- VCL框架学习之:如何将Windows消息与控件事件挂接起来
- windows核心编程 如何等待超过64(MAXIMUM_WAIT_OBJECTS) kernal object
- c#中如何截取Windows消息来触发自定义事件
- 如何:在派生类中引发基类事件(C# 编程指南)
- 如何通过编程访问Windows SharePoint Services 3.0中的列表文件夹