gpt4 book ai didi

objective-c - 虚拟按键转到错误的应用程序

转载 作者:行者123 更新时间:2023-12-03 16:54:05 26 4
gpt4 key购买 nike

我有以下代码将虚拟按键发送到给定 pid 的进程

    NSRunningApplication* app = [NSRunningApplication
runningApplicationWithProcessIdentifier: pid];
[app activateWithOptions: (NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)];

event1 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)cg_key_code, true);
event2 = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)cg_key_code, false);

CGEventPost(kCGHIDEventTap, event1);
CGEventPost(kCGHIDEventTap, event2);

正如预期的那样,我希望将按键发送到的进程立即出现在前面。但问题是,第一个按键将转到我的应用程序出现之前位于前面的应用程序。测试时,[app isActive] 第一次返回 false。在第一个 key 之后,一切都会顺利。

为什么会发生这种情况?即使我在将我的流程放在前面之后发布了关键事件。

最佳答案

由于文档没有说 activateWithOptions: 等待,并且当应用程序到达前台时它没有提供回调的完成 block ,我们可以假设该方法将返回为一旦检查了交换机的有效性并发送了激活消息。发生这种情况和应用程序实际准备好接收用户输入之间不可避免地会存在一些延迟。

虽然我们希望 OS X 能够缓冲用户输入并在准备就绪时将其发送到应用程序,但在这种情况下总会出现竞争条件,因此谨慎地编写代码时需要等待。

仅仅等待设定的时间并不是一个好主意,但是您可以使用工具来确定应该执行什么操作以及执行多长时间 - 特别是使用 isActive。另外,请谨慎检查 activateWithOptions: 的响应,以确保我们不会陷入僵局。

类似于:

if ([app activateWithOptions:(NSApplicationActivateAllWindows | NSApplicationActivateIgnoringOtherApps)]) {

while (![app isActive]) {
app = [NSRunningApplication
runningApplicationWithProcessIdentifier: pid];
[NSThread sleepForTimeInterval:0.05];
}
}

// send key press events

关于objective-c - 虚拟按键转到错误的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28798555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com