繁体   English   中英

CGEventTapCreate在Cocoa中观看键盘输入

[英]CGEventTapCreate's watching keyboard input in Cocoa

问候。 我试着让孩子控制应用程序。 键盘记录器是此应用程序的一部分。 我使用CGEventTapCreate来观看键盘。 这很好用,但有时我会重复关键事件。 它们没有设置[NSEvent isARepeat],只是重复。 例如,我可以输入“qwerty”但应用程序会获取这些字符的关键事件:“qqwweerrttyy”。 也许有人经历过这样的喜欢吗? 我在10.5和10.6上都遇到了这个问题(两者都是英特尔)。

我在这里发布键盘记录器安装和处理程序方法:

- (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成功,您仍然使用键+鼠标创建另一个。 这就是为什么你会得到重复的击键事件?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM