Objective c CGEvent NSKeyDown仅在应用程序位于最前端时工作?
我正在尝试自动化一些任务(没有applescript支持),所以我必须使用CGEvents并发布这些事件。鼠标点击可以正常工作,但只有在我点击dock中的应用程序时,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"]
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它是在后台?如果是这样,你就没有太多可以做的了…这里的目标是为第三方应用程序编写脚本,即你无法控制其代码的第三方应用程序吗?应用程序在后台时不会对关键事件进行操作。它们必须安装事件点击或监视器来执行此操作。嗨,谢谢你的回复。这基本上是一样的我正在这样做,但我尝试了你的方式,仍然得到同样的东西。只有在应用程序是最前面的情况下才有效。再次感谢。