1

你好。我正在尝试监视用户在可可应用程序中按下的键。

我使用了这段代码:

 // this code works!
 CGEventMask keyboardMaskKeyDown = CGEventMaskBit(kCGEventKeyDown);

 keyboardEventresult = [NSEvent addGlobalMonitorForEventsMatchingMask:keyboardMaskKeyDown handler:^(NSEvent *keyboardEvent)
 {
      keyboardEventresult = keyboardEvent;
      _currentKeystr = [NSString stringWithFormat:@"%c",[[keyboardEvent characters]characterAtIndex:0]];
      NSLog(@"Pressed key: %@",_currentKeystr);
      [hiddentextfield setStringValue:[NSString stringWithFormat:@"%@",_currentKeystr]];
  }];

但问题是当我改变时:

 addGlobalMonitorForEventsMatchingMask

 addLocalMonitorForEventsMatchingMask

我收到一条错误消息Cannot initialize a parameter of type NSEvent *(^)(NSEvent *_strong) with an rvalue of type void(^)(NSEvent *_strong)

在这里你可以看到苹果正在做类似的事情

         _eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:

        (NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask | NSKeyDownMask)

        handler:^(NSEvent *incomingEvent) 

有想法该怎么解决这个吗?

4

1 回答 1

2

错误消息告诉您您传递的参数类型错误。它是期待的NSEvent *(^)(NSEvent *_strong)(一个带有一个类型参数NSEvent*并返回的块NSEvent*),但您传递的是一个void(^)(NSEvent *_strong)(一个带有一个类型参数NSEvent*并返回的块void。注意块的返回类型的差异 - 它们必须完全匹配。

要解决此问题,请让您的块返回一个NSEvent*. 根据文档,您需要“返回未修改的事件,创建并返回一个新的 NSEvent 对象,或者返回 nil 以停止事件的调度”。因此,在块的末尾添加一条return <something>;语句,其中<something>是相同事件、新事件或nil.

于 2013-03-31T20:50:41.743 回答