Objective c 将NSEvent发送到后台应用程序

Objective c 将NSEvent发送到后台应用程序,objective-c,macos,cocoa,keycode,nsevent,Objective C,Macos,Cocoa,Keycode,Nsevent,我需要发送组合键^⌘C到具有捆绑包标识符的后台应用程序com.company.app。然后,组合键应激活该应用程序中的菜单项 不幸的是,我不知道该怎么做。一些研究指出,我使用CGEventPostToPSN()使用了NSEvent和CGEvent API,但我无法使其正常工作,因为我不知道如何设置键组合CGEventPost()似乎无法处理我创建的事件,即使所需的应用程序是活动的 下面是我最终提出的代码,但这不起作用: CGWindowID windowNumber; NSEvent *even

我需要发送组合键^⌘C到具有捆绑包标识符的后台应用程序
com.company.app
。然后,组合键应激活该应用程序中的菜单项

不幸的是,我不知道该怎么做。一些研究指出,我使用
CGEventPostToPSN()
使用了NSEvent和CGEvent API,但我无法使其正常工作,因为我不知道如何设置键组合
CGEventPost()
似乎无法处理我创建的事件,即使所需的应用程序是活动的

下面是我最终提出的代码,但这不起作用:

CGWindowID windowNumber;
NSEvent *event = [NSEvent keyEventWithType:NSKeyUp
                                  location:NSZeroPoint
                             modifierFlags:(NSControlKeyMask | NSCommandKeyMask)
                                 timestamp:[[NSProcessInfo processInfo] systemUptime]
                              windowNumber:windowNumber
                                   context:[NSGraphicsContext currentContext]
                                characters:@"c"
               charactersIgnoringModifiers:@"c"
                                 isARepeat:NO
                                   keyCode:8];
CGEventRef eventRef = [event CGEvent];
我现在该怎么办呢?为什么
cgreventpost()
没有
NSEvent
等价物?有没有比发布活动更容易激活该菜单项的方法?我可以轻松获得
NSRunningApplication
的实例,但没有合适的API来完成我的任务

更新: 我让它工作了:

- (void) postFakedKeyboardEventForCopyScreenToPasteboardToPSN:(ProcessSerialNumber)psn {
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStatePrivate);
    CGEventRef keyDownEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, true);
    CGEventSetFlags(keyDownEvent, (kCGEventFlagMaskControl | kCGEventFlagMaskCommand));
    CGEventRef keyUpEvent = CGEventCreateKeyboardEvent(source, (CGKeyCode)8, false);
    CGEventSetFlags(keyUpEvent, (kCGEventFlagMaskControl | kCGEventFlagMaskCommand));
    CFRelease(source);

    CGEventPostToPSN(&psn, keyDownEvent);
    CFRelease(keyDownEvent);
    CGEventPostToPSN(&psn, keyUpEvent);
    CFRelease(keyUpEvent);
}

请注意:

  • 也发送keyDown事件,而不仅仅是keydup。这样,它将更像一个真正的按键

  • 您需要使用该CGEvent调用CGEventPostToPSN,或者至少调用一些发布事件的调用

  • 您尝试过调用CGPostKeyboardEvent()吗
  • CGPostKeyboardEvent()
    已被弃用,但我使用文档中推荐的函数使其正常工作。你能解释一下如何准确地使用
    CGEventPostToPSN()
    ?谢谢。:)现在这是一个选择器!不是特别批评你,真的,但是为什么Obj-C-world中的每个人都要用这些巨大的名字
    PostFakedKeyboardEventforCopyScreentTopFasteboardTopsN
    OSStatus err = noErr;
    ProcessSerialNumber psn;
    err = GetProcessForPID([simulator processIdentifier], &psn);
    if (err == noErr)
        [self postFakedKeyboardEventForCopyScreenToPasteboardToPSN:psn];