您好。我正在尝试监控用户在可可应用程序中按下的键。
我使用了这段代码:
// 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)
Here你可以看到苹果正在做类似的事情
_eventMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:
(NSLeftMouseDownMask | NSRightMouseDownMask | NSOtherMouseDownMask | NSKeyDownMask)
handler:^(NSEvent *incomingEvent)
有关如何解决此问题的任何想法?
答案 0 :(得分:2)
错误消息告诉您传递了错误类型的参数。它期望NSEvent *(^)(NSEvent *_strong)
(一个块采用NSEvent*
类型的一个参数并返回NSEvent*
),但是你传递的是void(^)(NSEvent *_strong)
(一个块采用{{1}类型的参数{1}}并返回NSEvent*
。请注意块的返回类型的差异 - 它们必须完全匹配。
要解决此问题,请让您的块返回void
。根据{{3}},您需要“返回未修改的事件,创建并返回新的NSEvent对象,或返回nil以停止调度事件。”因此,在块的末尾添加NSEvent*
语句,其中return <something>;
是同一事件,新事件或<something>
。