2011-05-18 64 views
0

我试图自动化一些任务(没有applescript支持),所以我必须使用CGEvents并发布这些事件。鼠标选择工作正常,但如果我点击在Dock中的应用程序(这使得它最前端的应用程序)NSKeyDown(输入)只能... 这里是我到目前为止的代码:只有当应用程序最前面时,CGEvent 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); 

我之所以在循环中有posteventtopsn是为了测试目的(我只是需要它发送一次)。当程序在循环中时,如果我将应用程序激活到最前面,则该事件正常工作。

我在做什么错?如果它在后台可以工作吗?谢谢。

+0

你的意思是说你想在后台使用你的应用程序,或者你想在后台发送事件给应用程序? – 2011-05-18 17:35:23

+0

此代码(包含循环和“睡眠”)与您尝试发送事件的应用程序相同吗? – 2011-05-18 17:45:11

+0

嗨,谢谢你的回复。 @Josh - 不,它不在同一个应用上运行。 @Nathan - 我想在后台发送事件到应用程序。鼠标点击工作正常,但nskeydown只适用于我使它最前端的应用程序。 – user635064 2011-05-18 17:48:53

回答

1

这里是一个更好的方式来发布键盘事件到最前端的应用程序:

CGEventRef a = CGEventCreateKeyboardEvent(NULL, 124, true); 
    CGEventRef b = CGEventCreateKeyboardEvent(NULL, 124, false); 
    CGEventPost(kCGHIDEventTap, a); 
    CGEventPost(kCGHIDEventTap, b); 

CGEventPost让您确定该事件被公布。我最近使用此代码来允许某人远程控制笔记本电脑上的PPT演示文稿。 (字符124是右箭头键。)

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

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

+1

user635 is _already_ using CGEventPostToPSN – 2011-05-18 17:45:40

+0

嗨, 感谢您的回复。这与我正在做的事情基本上是一样的,但我尝试了你的方式,仍然得到同样的结果。只有当应用程序在最前面时才有效。再次感谢。 – user635064 2011-05-18 17:52:52

0

我认为这是因为您使用参数windowNumber的“WIDK”创建NSEvent,并且WIDK仅与您的应用程序相关。

相关问题