3

我在模拟 OSX 中的键盘事件的守护程序(根进程)中有以下代码。

CGEventRef keyEvent = CGEventCreateKeyboardEvent (NULL, (CGKeyCode)keyCode, keyDown);
CGEventPost(kCGHIDEventTap, keyEvent);
CFRelease(keyEvent);

当我在 User1 中并且守护程序加载到 Root 上下文中时,键盘事件可以很好地模拟。当我切换到 User2 时,除 Shift 键之外的所有事件都成功执行。出于某种原因,尽管我当前登录到 User2,但在 User1 中执行了 Shift 键的键盘事件。

我也尝试过使用移位掩码:

CGEventRef  event1 = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)keyCode, true);//'z' keydown event
CGEventSetFlags(event1, kCGEventFlagMaskShift);//set shift key down for above event
CGEventPost(kCGHIDEventTap, event1);//post event
CFRelease(event1);

这在 User1 中也可以正常工作。当我切换到 user2 并执行如上所示的关键事件时,它会在 User1 的最前面的应用程序中执行这些事件。Shift 键按下或任何带有 Shift 掩码的键按下的事件转到 User1,而不是当前登录的用户

无论如何我可以确保在登录用户中执行键盘事件?

4

1 回答 1

1

创建 后keyEvent,在发布之前设置修饰符标志:

CGEventFlags flags = kCGEventFlagMaskShift;
CGEventSetFlags(keyEvent, modifierFlags);
于 2015-08-18T05:48:49.030 回答