【问题标题】:Issue with CGEventTapCreate() callCGEventTapCreate() 调用问题
【发布时间】:2010-06-01 04:51:46
【问题描述】:

我正在尝试使用此代码注册全局关键事件:

void function()
{
    CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventKeyUp),&keyUpCallback,NULL);


CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL, keyUpEventTap, 0);
    CFRelease(keyUpEventTap);

    CFRunLoopAddSource(CFRunLoopGetCurrent(), keyUpRunLoopSourceRef, kCFRunLoopDefaultMode);
    CFRelease(keyUpRunLoopSourceRef);
}

应用程序在执行 CFMachPortCreateRunLoopSource() 调用时崩溃。我认为崩溃是因为我创建事件点击时的 CGEventMaskBit(kCGEventKeyUp)。

但如果我使用CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,CGEventMaskBit(kCGEventFlagsChanged),&keyUpCallback,NULL) 创建事件点击,则应用程序可以正常工作。它不会崩溃。按下任何修饰键时我都会收到回调。但我需要获取按下删除键的回调。

有什么想法吗?

谢谢,

迪拉吉。

【问题讨论】:

  • 您是否尝试过监视按键事件?
  • 是的,我也尝试过按键事件。上键和下键都会崩溃。

标签: objective-c cocoa


【解决方案1】:

我认为您需要特殊权限才能注册键盘事件。我忘记了那是什么,但是为了测试它以root身份运行程序,看看它是否仍然崩溃。

编辑:

根据this article,您必须以 root 身份运行程序或启用辅助设备。

崩溃可能只是因为 CGEventTapCreate 返回 NULL。

【讨论】:

  • 非常感谢您的回复。是的,当我将 CGEventMaskBit(kCGEventKeyUp) 作为参数传递时,返回的 CGEventTapCreate 为空,但使用 CGEventMaskBit(kCGEventFlagsChanged) 作为参数时效果很好。如果它与以 root 身份运行的进程有关,那么这两个选项都应该返回 NULL 对吗?如果我错了,请纠正我。可能是什么问题?
  • 只有上键和下键事件需要特殊权限。鼠标和修饰键事件不受保护。
  • 这是一个安全问题。键盘记录器对键入的实际字符感兴趣,因此这需要更高的权限,以便您在应用程序键盘记录您时注意到。密码的 option 或 shift 键包含的信息相对较少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 2015-10-31
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多