Objective c CGEvent NSKeyDown仅在应用程序位于最前端时工作?

Objective c CGEvent NSKeyDown仅在应用程序位于最前端时工作?,objective-c,cocoa,macos,nsevent,cgeventtap,Objective C,Cocoa,Macos,Nsevent,Cgeventtap,我正在尝试自动化一些任务(没有applescript支持),所以我必须使用CGEvents并发布这些事件。鼠标点击可以正常工作,但只有在我点击dock中的应用程序时,NSKeyDown(回车)才有效(这使它成为最前面的应用程序)。。。 以下是我目前的代码: for (NSDictionary *dict in windowList) { NSLog(@"%@", dict); if ([[dict objectForKey:@"kCGWindowName"]

我正在尝试自动化一些任务(没有applescript支持),所以我必须使用CGEvents并发布这些事件。鼠标点击可以正常工作,但只有在我点击dock中的应用程序时,NSKeyDown(回车)才有效(这使它成为最前面的应用程序)。。。 以下是我目前的代码:

   for (NSDictionary *dict in windowList) {
        NSLog(@"%@", dict);
        if ([[dict objectForKey:@"kCGWindowName"] isEqualToString:@"Some Window..."]) {
            WIDK = [[dict objectForKey:@"kCGWindowNumber"] intValue];
            break;
        };
    }


    CGEventRef CGEvent;
    NSEvent *customEvent;

    customEvent = [NSEvent keyEventWithType:NSKeyDown 
                                   location:NSZeroPoint 
                              modifierFlags:0 
                                  timestamp:1 
                               windowNumber:WIDK
                                    context:nil 
                                 characters:nil 
                charactersIgnoringModifiers:nil 
                                  isARepeat:NO 
                                    keyCode:36];

    CGEvent = [customEvent CGEvent];
    for (int i=0; i <5; i++) {
        sleep(3);
        CGEventPostToPSN(&psn, CGEvent);
        NSLog(@"posted the event");
    }

    CFRelease(eOne);
for(NSDictionary*窗口列表中的dict){
NSLog(@“%@”,dict);
if([[dict objectForKey:@“kCGWindowName”]isEqualToString:@“某些窗口…”){
WIDK=[[dict objectForKey:@“kCGWindowNumber”]intValue];
打破
};
}
CGEventRef CGEvent;
n事件*自定义事件;
customEvent=[NSEvent keyEventWithType:NSKeyDown
地点:NSZeroPoint
modifierFlags:0
时间戳:1
窗口号:WIDK
上下文:无
字符:无
charactersIgnoringModifiers:无
我重复一遍:没有
键码:36];
CGEvent=[customEvent CGEvent];

对于(int i=0;i,这里有一种更好的方法将键盘事件发布到最前端的应用程序:

  CGEventRef a = CGEventCreateKeyboardEvent(NULL, 124, true);
  CGEventRef b = CGEventCreateKeyboardEvent(NULL, 124, false);
  CGEventPost(kCGHIDEventTap, a);
  CGEventPost(kCGHIDEventTap, b);
CGEventPost允许您确定事件发布的位置。我最近使用此代码允许某人远程控制我笔记本电脑上的PPT演示文稿。(124字符是右箭头键。)

请注意,您应该在发布事件后释放它


您可以使用CGEventPostToPSN发送到特定的应用程序(例如不是前端应用程序)。

我认为这是因为您使用参数windowNumber的“WIDK”创建了一个N事件,而WIDK仅与您的应用程序相关。

您的意思是希望您的应用程序在后台,还是希望在后台向应用程序发送事件?这是代码吗(使用循环和
睡眠
)在您试图向其发送事件的同一应用程序中?您好,谢谢您的回复。@Josh-不,它不是在同一应用程序上运行的。@Nathan-我想在后台向该应用程序发送事件。鼠标单击可以正常工作,但nskeydown只有在我将其设置为最前面的应用程序时才起作用。@user635064编写该应用程序时是否可能忽略事件n它是在后台?如果是这样,你就没有太多可以做的了…这里的目标是为第三方应用程序编写脚本,即你无法控制其代码的第三方应用程序吗?应用程序在后台时不会对关键事件进行操作。它们必须安装事件点击或监视器来执行此操作。嗨,谢谢你的回复。这基本上是一样的我正在这样做,但我尝试了你的方式,仍然得到同样的东西。只有在应用程序是最前面的情况下才有效。再次感谢。