我正在尝试将一个NSRunningApplication*
实例置于前台,并注入一个键盘事件。
NSRunningApplication* app = ...;
[app activateWithOptions: 0];
inject_keystrokes();
... 无法注入键盘事件,但是:
NSRunningApplication* app = ...;
[app activateWithOptions: 0];
dispatch_time_t _100ms = dispatch_time( DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC) );
dispatch_after(
_100ms,
dispatch_get_main_queue(),
^{ inject_keystrokes(); }
);
...成功。
我想窗口在前台渲染需要一定的时间,这可能发生在一个单独的线程上,这解释了注入失败。
然而,这是一个非常丑陋的解决方案。它依赖于任意时间间隔。
以某种方式等待窗口完成前景化会更干净。
有没有办法做到这一点?
PSinject_keystrokes()
用途CGEventPost(kCGHIDEventTap, someCGEvent)
PPS 参考:
-虚拟按键进入错误的应用程序
-将 NSEvent 发送到后台应用程序
- http://advinprog.blogspot.com/2008/06/so-you-want-to-post-keyboard-event-in.html