我正在尝试将一个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(); }
);..。成功吧。
我想窗口在前台渲染需要一定的时间,这可能发生在一个单独的线程上,这解释了注入失败的原因。
然而,这是一个非常丑陋的解决办法。它依赖于任意的时间间隔。
不知何故,等着窗户完成前景化就更干净了。
有办法这样做吗?
PS inject_keystrokes()使用CGEventPost(kCGHIDEventTap, someCGEvent)
PPS参考文献:
发布于 2019-07-13 20:10:09
在isActive上为KVO属性添加一个观察者对我来说是有效的。
for (NSRunningApplication* ra in [[NSWorkspace sharedWorkspace] runningApplications])
{
if ([ra.bundleIdentifier isEqualToString:@"com.apple.TextEdit"])
{
[ra addObserver:self forKeyPath:@"isActive" options:0 context:ra];
[ra retain];
[ra activateWithOptions:0];
}
}
// ...
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context
{
if ([keyPath isEqualToString:@"isActive"])
{
NSRunningApplication* ra = (NSRunningApplication*) context;
[ra removeObserver:self forKeyPath:@"isActive"];
[ra release];
inject_keystrokes();
}
}请注意,我手动保留并释放NSRunningApplication以保持其引用的活动,因为我没有将它保存在属性或ivar中。你必须小心,不要在观察者还在的情况下放弃引用。
https://stackoverflow.com/questions/57006309
复制相似问题