Windows Event_System_Foreground交货订单

时间:2014-07-28 11:17:55

标签: windows winapi

使用插件架构(特别是Sparx Systems Enterprise Architect),它不转发原始或熟悉的键盘事件,可以使用RegisterHotKey()定义插件的键盘快捷键。这些热键是全局的,如果指定的组合键已经注册,则注册调用将失败。

由于插件执行的应用程序可以在多个实例中运行,因此需要根据前台中的实例重复注册和取消注册热键。可以为此目的设置event hook EVENT_SYSTEM_FOREGROUND,但问题是:是否有保证的送达订单?

我需要首先告诉失去焦点的实例,以便它可以在获得焦点的实例尝试注册之前取消注册热键。

这可能吗?或者我必须实现同步才能确定吗?

1 个答案:

答案 0 :(得分:0)

Windows DevCenter WM_ACTIVATE message

  

..发送到正在激活的窗口和停用的窗口。如果窗口使用相同的输入队列,则同步发送消息,首先发送到被停用的顶级窗口的窗口过程,然后发送到被激活的顶级窗口的窗口过程。如果窗口使用不同的输入队列,则会异步发送消息,因此窗口会立即激活..

因此,如果您的所有窗口都来自同一个应用程序共享相同的输入队列,那么应该保证它。我想EVENT_SYSTEM_FOREGROUND建立在旧逻辑之后的旧代码之上(至少在http://svn.reactos.org/svn/reactos/trunk/reactos/win32ss/user/ntuser/focus.c?view=markup的ReactOS中实现(参见co_IntSetActiveWindow中的EVENT_SYSTEM_FOREGROUND))

如果您使用Windows DevCenter SetWindowsHookEx function,过滤器WH_KEYBOARD

仅监控原始主机进程中的键盘事件(无全局副作用),则问题可能会更容易

在这种情况下,您的代码将在一个具有一个全局变量的exe中存在一次,不需要跨进程同步