使用插件架构(特别是Sparx Systems Enterprise Architect),它不转发原始或熟悉的键盘事件,可以使用RegisterHotKey()定义插件的键盘快捷键。这些热键是全局的,如果指定的组合键已经注册,则注册调用将失败。
由于插件执行的应用程序可以在多个实例中运行,因此需要根据前台中的实例重复注册和取消注册热键。可以为此目的设置event hook EVENT_SYSTEM_FOREGROUND,但问题是:是否有保证的送达订单?
我需要首先告诉失去焦点的实例,以便它可以在获得焦点的实例尝试注册之前取消注册热键。
这可能吗?或者我必须实现同步才能确定吗?
答案 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中存在一次,不需要跨进程同步