objective-c - CGEventTapCreate在 cocoa 中的监视键盘输入

标签 objective-c cocoa macos

问候。
我尝试制作 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/

相关文章:

cocoa - 是否可以比较2个sqlite文件并更新

iphone - 我可以使用静态 IBAction 方法进行事件连接吗?

c++ - Qt 5.0 和 c++11 与 OSX Mountain Lion

java - Mac OSX 10.6.7 上进程 'java' 的大量线程和内存使用

objective-c - 当应用程序被卸载时,我的 UIPasteboard 上的持久性仍然有效。为什么?

objective-c - 在另一种方法中添加事件指示器以避免挂起

ios - 如何在 swift 中将 PHASset UTI 转换为具有 mime 类型的字符串

ios - 在 iOS 7 中管理核心数据线程

objective-c - Mac OS X 上的简单 Cocoa 模态窗口对话框

macos - 在 Mac OSX 上哪里可以找到 "save"和 "open"按钮的图标文件?