在插件架构(特别是Sparx Systems Enterprise Architect)中工作,该架构既不转发原始键盘事件,也不转发熟知的键盘事件,可以使用RegisterHotKey()定义插件的键盘快捷键。这些热键是全局的,如果指定的组合键已经注册,则注册调用将失败。
由于执行插件的应用程序可以在多个实例中运行,因此需要根据哪个实例在前台来重复注册和注销热键。可以为此目的设置EVENT_SYSTEM_FOREGROUND的event hook,但问题是:是否有保证交付订单?
我需要先通知失去焦点的实例,以便它可以在获得焦点的实例尝试注册热键之前注销它们。
这个是可能的吗?或者我必须实现同步才能确定?
发布于 2014-09-03 01:29:55
Windows DevCenter WM_ACTIVATE message说
..Sent到激活的窗口和停用的窗口。如果两个窗口使用相同的输入队列,则同步发送消息,首先发送到被停用的顶层窗口的窗口过程,然后发送到被激活的顶层窗口的窗口过程。如果窗口使用不同的输入队列,则消息将异步发送,因此窗口将立即激活。
因此,如果你的所有窗口都来自同一个应用程序,共享同一个输入队列,那么它应该是有保证的。我猜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、filter WH_KEYBOARD仅监控原始托管进程中的键盘事件(无全局副作用),您的问题可能会更简单
在这种情况下,您的代码将在具有一个全局变量的一个exe中存在一次,不需要跨进程同步。
https://stackoverflow.com/questions/24994102
复制相似问题