修改 NSEvent 以发送与按下的键不同的键

2023-11-25

我正在尝试创建一个 OS X 键盘挂钩用于辅助技术目的(即不用担心,不是键盘记录器)。

当用户按下某个键时,我想要prevent真正的按键和send而是一个假按键(我选择的角色)。

我有以下代码:

- (void) hookTheKeyboard {
    CGEventMask keyboardMask = CGEventMaskBit(kCGEventKeyDown);
    id eventHandler = [NSEvent addGlobalMonitorForEventsMatchingMask:keyboardMask handler:^(NSEvent *keyboardEvent) {
        NSLog(@"keyDown: %c", [[keyboardEvent characters] characterAtIndex:0]);
        //Want to: Stop the keyboard input
        //Want to: Send another key input instead
    }];
}

对实现这两个目标有什么帮助吗?基本上修改 NSEvent“keyboardEvent”以发送不同的字符。谢谢。


你不能用NSEventAPI,但你can这样做与CGEventTap。您可以创建活动事件点击并注册回调接收一个CGEventRef并且可以修改它(如果需要)并返回它以修改实际的事件流。


EDIT

这是一个简单的程序,在运行时,将每个“b”击键替换为“v”:

#import <Cocoa/Cocoa.h>

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {
  //0x0b is the virtual keycode for "b"
  //0x09 is the virtual keycode for "v"
  if (CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) == 0x0B) {
    CGEventSetIntegerValueField(event, kCGKeyboardEventKeycode, 0x09);
  }

  return event;
}

int main(int argc, char *argv[]) {
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
  CFRunLoopSourceRef runLoopSource;

  CFMachPortRef eventTap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionDefault, kCGEventMaskForAllEvents, myCGEventCallback, NULL);

  if (!eventTap) {
    NSLog(@"Couldn't create event tap!");
    exit(1);
  }

  runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, eventTap, 0);

  CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);

  CGEventTapEnable(eventTap, true);

  CFRunLoopRun();

  CFRelease(eventTap);
  CFRelease(runLoopSource);
  [pool release];

  exit(0);
}

(有趣的故事:当我编辑这篇文章时,我一直试图写“替换每个“b”击键”,但它一直写成“替换每个“v”击键”。我很困惑。然后我想起了这一点我还没有停止该应用程序。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改 NSEvent 以发送与按下的键不同的键 的相关文章

随机推荐

  • 等待 do shell 脚本完成

    我正在尝试使用 Applescript 在 Xcode 中创建一个应用程序来转换 PDF 问题是我需要 Xcode AppleScript 等待每个 do shell script 命令完成处理 然后才能开始下一个命令 有没有办法检测每个脚
  • 评估符号表达

    syms t Define symbolic var x y int t 2 Calculate integral of x it should be t 3 3 x 1 10 现在我要计算y x 它应该是 1 3 8 3 1000 3 简
  • Bootstrap 3.1.1 导航栏最大化输入在 3.2.0 中不再最大化

    问题 如何在 Bootstrap 3 2 0 导航栏中获得最大化的搜索输入 在 Bootstrap 3 1 1 中 我使用以下代码作为固定底部导航栏来显示最大化的搜索输入
  • Hashmap 会自动排序吗?

    这是我的哈希图 HashMap
  • Android:PSS(比例集大小)计算

    我试图弄清楚 Android 中 PSS 是如何计算的 我找到了一个article其内容如下 进程的 比例集大小 PSS 是页数 它在内存中 其中每个页面除以页数 共享它的进程 因此 如果一个进程有 1000 个页面 全部属于它自己 与另一
  • 如何为列中的每个单元格执行函数并循环遍历所有工作簿?

    这是我到目前为止所拥有的 Sub TrimColumnD Dim ws As Worksheet For Each ws In ThisWorkbook Worksheets Dim c As Range For Each c In Act
  • 生成器角度模块没有创建新项目

    我是自耕农工具集的新手 我在 Ubuntu 12 中运行以下命令 npm install g yo npm install g generator webapp yo webapp 我能够创建一个网络应用程序项目 之后我尝试创建一个有角度的
  • 使用 WMI ManagementObjectSearcher 缺少指令或程序集引用?

    我找到了这个链接 使用 C 检测 Windows 上的防病毒软件 然而 当我在 Visual C Express Edition 2008 中尝试此代码时 它显示 Error 1 The type or namespace name Man
  • Git hook:启用回显命令

    有没有办法在 git hook 中启用 echo var git repositories project git hooks post update bin bash unset GIT DIR echo post update hook
  • Parse.com 出现奇怪问题,未包含密钥

    我遇到了与此非常相似的问题one 基本上我使用 Parse com 加载一些具有 PFUser 指针的对象 然后我还使用 includeKey 来包含这些 PFUsers 这是代码 PFQuery query PFQuery queryWi
  • G++ 4.6 -std=gnu++0x:静态局部变量构造函数调用时序和线程安全

    void a void b struct X X b void f a static X x 假设在进入 main 之后 f 被不同的线程 可能存在竞争 多次调用 当然 对 a 和 b 的唯一调用就是上面看到的那些 当上面的代码被编译时海湾
  • 用于没有模型的对象的石墨烯解析器

    我正在尝试编写一个解析器 它返回由函数创建的对象 它从memcached获取数据 所以没有实际的model我可以把它绑起来 我认为我的主要问题是我不知道什么type使用以及如何设置它 我将其与 Django 结合使用 但我不认为这是 dja
  • 在 ggplot2 中使用 grconvertX/grconvertY

    我想弄清楚如何在 ggplot 中使用 grconvertX grconvertX 我的最终目标是向ggplot2图 也可能是lattice with grid text and grid lines从用户坐标到设备坐标 我知道可以用 gr
  • 在响应式布局中隐藏元素?

    通过引导程序查看 它们似乎支持折叠较小屏幕的菜单栏项目 页面上的其他项目是否有类似的内容 例如 我有一个带有导航药丸的浮动右侧 在小屏幕上这会导致问题 我很乐意至少将其放入类似的点击显示更多下拉列表中 这在现有的 Bootstrap 框架中
  • 改变图像标签的原型?

    我正在尝试编写一个可以执行以下操作的库 当该库包含在 head 中时 它会更改 HTMLImageElement 原型 以便用户在 HTML 中碰巧使用的或在 javascript 中动态创建的任何图像标记都将具有由我的库定义的默认 one
  • 如何在 WPF 列表框中排序?

    C 4 0 WPF 应用程序 请参阅下面的代码 在启动时显示 单击 abd 后Sort按钮与btnSort Click 单击事件处理程序 如何按 aaa bbb ccc 顺序排序 C 代码 public MainWindow Initial
  • 保存更高分辨率的图表而不弄乱外观

    你们都必须原谅我的无知 因为我最近才开始使用 C 我只是有一个关于 Windows 图表控件的问题 因为我遇到了一个相当愚蠢的问题 我有一个程序 其中有一些报告 其中包括漂亮的窗口图表来表示一些数据 但是 我一直将这些图表保存到文件中以供各
  • Python 多处理中的子级与父级通信

    我正在编写一个 python 脚本 它将通过将行发送到不同的进程来处理来快速解析文件 最后 我希望父进程接收每个子进程的结果 然后能够对其进行操作 这是代码 usr bin env python import os import re fr
  • 在 Windows 上将 Anaconda 的根 Python 更新到更新的次要版本没有任何作用

    我在 Windows 上安装了 Anaconda 不是 miniconda Python 2 7 我想将安装的 Python 版本更新到最新的次要版本 2 7 9 我看到该版本可以在以下渠道中找到 conda配置为使用 然而 输入conda
  • 修改 NSEvent 以发送与按下的键不同的键

    我正在尝试创建一个 OS X 键盘挂钩用于辅助技术目的 即不用担心 不是键盘记录器 当用户按下某个键时 我想要prevent真正的按键和send而是一个假按键 我选择的角色 我有以下代码 void hookTheKeyboard CGEve