在Mac中使用CFEvents从Daemon执行键盘事件



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

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

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

我也尝试过使用移位遮罩:

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,而不是当前登录的用户

我是否可以确保在登录用户中执行键盘事件?

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

CGEventFlags flags = kCGEventFlagMaskShift;
CGEventSetFlags(keyEvent, modifierFlags);

最新更新