问候。
我尝试制作 child 控制应用程序。键盘记录器是此应用程序的一部分。
我使用CGEventTapCreate来观看键盘。这很好用,但是有时我会重复按键事件。他们没有设置[NSEvent isARepeat],只是重复项。例如,我可以键入“qwerty”,但是应用程序会获得这些字符的按键事件:“qqwweerrttyy”。也许有人像这样经历过?我在10.5&10.6(都是Intel)上遇到了这个问题。
我在这里发布键盘记录器的安装和处理程序方法:
- (BOOL)installKeyboardLogger
{
CGEventMask keyboardMask = CGEventMaskBit(kCGEventKeyDown);
CGEventMask mouseMask = CGEventMaskBit(kCGEventMouseMoved) | CGEventMaskBit(kCGEventLeftMouseDown) |
CGEventMaskBit(kCGEventRightMouseDown);
CGEventMask mask = keyboardMask + mouseMask;// + mouseMask;//CGEventMaskBit(kCGEventKeyDown) | CGEventMaskBit(kCGEventMouseMoved);
// Try to create keyboard-only hook. It will fail if Assistive Devices are not set.
mMachPortRef = CGEventTapCreate(
kCGAnnotatedSessionEventTap,
kCGTailAppendEventTap, // kCGHeadInsertEventTap
kCGEventTapOptionListenOnly,
keyboardMask,
(CGEventTapCallBack)eventTapFunction,
self );
if (!mMachPortRef)
[mLogFile logNeedAssistiveDevice: @"Can't install keyboard hook."];
else
CFRelease(mMachPortRef);
mMachPortRef = CGEventTapCreate(
kCGAnnotatedSessionEventTap,
kCGTailAppendEventTap, // kCGHeadInsertEventTap
kCGEventTapOptionListenOnly,
mask,
(CGEventTapCallBack)eventTapFunction,
self );
if (!mMachPortRef)
{
[mLogFile logNeedAssistiveDevice: @"Can't install keyboard&mouse hook."];
return NO;
}
mKeyboardEventSrc = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, mMachPortRef, 0);
if ( !mKeyboardEventSrc )
return NO;
CFRunLoopRef runLoop = CFRunLoopGetCurrent();
if ( !runLoop )
return NO;
CFRunLoopAddSource(runLoop, mKeyboardEventSrc, kCFRunLoopDefaultMode);
return YES;
}
CGEventRef eventTapFunction(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon)
{
if (type != NX_KEYDOWN && type != NX_OMOUSEDOWN && type != NX_OMOUSEUP && type != NX_OMOUSEDRAGGED &&
type != NX_LMOUSEUP && type != NX_LMOUSEDOWN && type != NX_RMOUSEUP && type != NX_RMOUSEDOWN &&
type != NX_MOUSEMOVED && type != NX_LMOUSEDRAGGED && type != NX_RMOUSEDRAGGED)
return event;
NSEvent* sysEvent = [NSEvent eventWithCGEvent:event];
if (type == NX_KEYDOWN && [sysEvent type] == NSKeyDown)
{
if (![sysEvent isARepeat])
[(ControlPanelController*)refcon handleCapturedCharacters: [sysEvent characters]];
}
else
[(ControlPanelController*)refcon handleMouse];
return event;
}
最佳答案
如果您的第一个CGEventTapCreate成功,您仍然可以使用key + mouse创建另一个。这就是为什么您会收到重复的按键事件吗?
关于objective-c - CGEventTapCreate在 cocoa 中的监视键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4556278/