首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在 OS X 中监听键盘按下

在 OS X 中监听键盘按下事件可以使用 CGEventTapCreate 函数。该函数可以创建一个事件过滤器,用于捕获与指定事件相关的键盘输入。

以下是一个简单的示例代码,用于在 OS X 中监听键盘按下事件:

代码语言:objective-c
复制
#import <Foundation/Foundation.h>

@interface KeyboardObserver : NSObject

@property (nonatomic) CFMachPortRef port;

- (void)start;

@end

@implementation KeyboardObserver

- (instancetype)init {
    self = [super init];
    if (self) {
        CFRunLoopSourceRef source = CGEventTapCreate(
            NULL,                                       // 管道
            kCGEventTapOptionDefault,                  // 捕获模式
            CGEventTypeKeyboardKeyDown,              // 事件类型
            self,                                        // 目标对象
            (CFStringRef)@"keyboard_event"          // 事件名称
        );
        if (!source) {
            NSLog(@"Failed to create event tap!");
            return self;
        }
        self->port = CFMachPortCreate(NULL, source, NULL);
        CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);
        CGEventTapEnable(self->port, true);
    }
    return self;
}

- (void)dealloc {
    if (self->port) {
        CGEventTapEnable(self->port, false);
        CFRunLoopRemoveSource(CFRunLoopGetCurrent(), self->port, kCFRunLoopCommonModes);
        CFRelease(self->port);
    }
    [super dealloc];
}

- (void)start {
    dispatch_async(dispatch_get_main_queue(), ^{
        [[NSRunLoop currentRunLoop] run];
    });
}

@end

int main(int argc, const char *argv[]) {
    @autoreleasepool {
        KeyboardObserver observer = [[KeyboardObserver alloc] init];
        [observer start];
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}

上述代码定义了一个名为 KeyboardObserver 的类,该类实现了 CGEventTapCreate 函数,用于创建一个事件过滤器,并在该过滤器中捕获键盘按下事件。该类的 start 方法用于启动事件过滤器的运行,而 dealloc 方法用于释放事件过滤器所占用的资源。

在主函数中,我们创建了一个 KeyboardObserver 对象,并调用其 start 方法启动事件过滤器的运行。运行循环将一直运行,直到程序退出。

需要注意的是,在运行该程序时,需要将代码编译成动态库,并运行在支持事件过滤器的环境中,例如 macOS。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

使用JS监听键盘事件

事件说明 我们将键盘后事件的所有属性和方法打印出来(这里以1为例) document.onkeydown = function(event){ console.log(event)...; }  这里面有几个需要注意的属性 key:按键的名称 keyCode:按键的键码 altKey、ctrlKey、shiftKey:当组合(如ctrl+c)时,ctrlKey会变为...console.log(":"+event.key+"键:"+event.keyCode); } 下任意按键后的效果: 二、监听回车事件 这里以回车键(键码为13)为例 ,如果需要监听不同的按键...") } } 三、监听组合键 这里以CTRL+A为例 altKey:Alt+*组合键时为true ctrlKey:Ctrl+*组合键时为true shiftKey:Shift+...80 H 72 Q 81 I 73 R 82 字母和数字键的键码值 按键 键码 按键 键码 S 83 1 49 T 84 2 50 U 85 3 51 V 86 4 52 W 87 5 53 X

11.4K10
  • Mac OS X 创建和使用内存盘

    Mac OS X 创建和使用内存盘 Windows 系统上一直使用 ImDisk 创建内存盘作为缓存, 将系统临时目录、 浏览器缓存等设置到内存盘, 这样做的好处是很明显的: 1、 内存盘不用定时清理..., 系统重启就自动清空 2、 读写内存的速度是非常快的, 程序运行速度也会加快很多 现在转到 Mac OS X 平台, 当然也要使用内存盘了, OS X 系统上, 创建和使用内存盘比较容易的, 而且不需要借助第三方软件..., 只是设置稍微繁琐一些, OS X 系统上创建和使用内存盘的步骤如下: 1、 打开 AppleScript Editor(找不到的可以直接用 Spotlight 搜索); 2、 输入下面的脚本:...保存好之后, 可以先执行一, 看有没有挂载一个名称为 RamDisk 的内存盘, 加载好了如下图所示: ?...下面有没有生成对应的临时目录, 如果有, 就表示成功了, 如果没有, 就要再自己检查一步骤了。

    3K20

    Win8Vmware11安装使用苹果系统OS X 10.10

    这时,如果第一步成功的话,这里可以系统列表中看到Apple Mac OS X的选项了,下面版本选择 OS X 10.10,下一步。 ?...然后 Vmware 右下角的状态栏找到光盘图标,单击选择连接,就可以 OS X 的桌面右上角看到加载的磁盘了。没看到的话,按照下图设置一,还不行再重启系统。...解决方案就是回到虚拟机设置界面,选项打开共享文件夹,共享的路径尽量英文吧。具体如图: ?   按照图片设置结束后,把要拷进去的文件放在这里,然后重启 OS X 系统,即可看到这个文件夹。...然后系统设置里找到显示选项,看有没有适合你的分辨率,如果没有的话,打开 Vmware 设置,硬件里选择显示器,手动输入你想要的分辨率,点确定,再启动OS X系统,打开设置显示,菜单里出现了你需要的分辨率...---- 怎么联网   系统装好了,然后就要写代码了,OS X写代码当然要用强大的 Xcode 。

    1.8K00

    记录一个Mac OS X 本地安装Ghost 的报错问题

    新买的Macbook Air 升级了最新版的OS X 10.10 Yosemite,昨天本地安装Ghost 的时候出现了问题,在这里做一个记录。...安装Ghost报错 下载Ghost 后终端打开并通过 npm install --production 编译,但是整个过程试了两三次,好像可以,但npm start 启动无效,终端窗口报错如下: ?.../binding\Release\node-v11-darwin-x64\node_sqlite3.node'" 解决方案 通过搜索了十几个页面找到了如下原因及解决方案: 原因是:安装sqlite3 数据库失败...,失败的可能原因是安装源Amazon S3被墙(虽然我是全局代理模式安装的); 解决方案:通过 http://node-sqlite3.s3.amazonaws.com/Release/node_sqlite3...-v2.1.a-node-v11-darwin-x64.tar.gz 下载文件并解压放到 ghost安装路径\node_modules\sqlite3\lib\binding\Release 文件夹下,

    1.6K90

    Python解放双手

    (x, y, button, pressed): """鼠标点击的监听方法 x,y 为坐标,button 为按钮,pressed 为是否是""" if pressed:...(x, y, dx, dy): """鼠标滚动的监听方法 x,y 为作为,dx,dy 为滚动幅度""" print('鼠标{0}, 向右滚动{1}, 向下滚动{2}'.format((... keyboard 模块 Key 类,提供了大量预设的按钮,我们可以直接使用: from pynput import keyboard # 创建键盘 kb = keyboard.Controller...3.2、两个按钮 我们可以通过多次调用 press 的方法几个按钮,当然我们还有一种简便写法: from pynput import keyboard # 创建一个键盘 kb = keyboard.Controller...3.4、事件监听 键盘监听同样是由 keyboard Listener 类实现的: from pynput import keyboard # 按钮 def on_press(key):

    1.1K30

    如何用无线键盘控制树莓派小车

    2.无线键盘。 ? 0x02 方案 树莓派系统上搭建两个服务:键盘监听服务和小车转向控制服务。 键盘监听服务主要用于监听键盘的按键,并将按键发送给小车转向控制服务。...小车右转 方向键右抬起 小车停止 0x03 键盘监听服务设计 首先确定键盘对应的event,可以输入如下命令查询。...键盘监听核心代码: ? 0x04 小车转向控制服务设计 小车转向控制服务采用C++语言和python语言混合编程实现。 python语言程序只用于控制小车的动作:前进、后退、左转、右转、停止。...控制系统的代码就不粘贴了,只把设计过程遇到的问题与大家分享。 控制系统设计过程遇到这样一个问题: 如果按键一直,当按键抬起时小车不会立刻停止,而是过一才会停止。...导致问题发生的原因: 由于按键一直会有大量的按键请求发送过来,而小车的动作响应要慢于键盘按键响应,会有大量的按键请求堆积在处理线程,而按键抬起请求处于队列最末尾,是最后执行的,所以当按键抬起时小车才不会立刻停止

    2.1K40

    【SWT】常用代码(二)

    前言:窗口事件 很多桌面应用程序与用户的交互都是通过事件机制来实现的,如鼠标键或键盘或 者释放。事件通过监听器通知应用程序哪个部件发生了什么动作,然后作出相应的反应。...一:监听器 其实 SWT 处理事件与 Java 的 AWT 事件类似,对于每种事件有与之对应的 Listener 类,如果一个事件为 X,那么对应的监听器(Listener)类就是 XListener...三:键盘鼠标事件 本节中介绍键盘事件(KeyEvent),当键被或释放时触发键盘事件。SWT 提供的 键盘事件如表所示。...当同时 SHIFT 键和 X 键 时,控制台将输出“SHIFT+X”;当下任意字母键时,程序将执行 string+=event.character 语句把该键的字符输出,如果“A”键则输出“a”...实例  stateMask 检测键盘按键 Alt、Shift、Ctrl 键和鼠标键 Button1、Button2、Button3(左、 、右)是否同时,下面代码实现了鼠标事件触发时的状态(源代码对应光盘上

    9810

    「 毫秒级 」的应用启动速度评测

    键盘调起自动化 首先需要确认的是,在手机上执行输入法切换与键盘调起等操作的自动化命令——我们可以找出设备屏幕上的相应坐标后,通过以下adb命令进行实现: def turn_up_swtich(self...# 根据色块颜色变化情况判断是否发生输入框 if self.is_key_down(block_img, num): has_keydown = True # 记录发生输入框画面的帧数...is_key_down_num = num if has_keydown: # 由发生输入框开始,保存标识处图片 cv2.imwrite("....——模拟输入框时,屏幕顶部色块的颜色变红(如下图),即可通过图像处理模块cv2,对画面相应坐标处的颜色变化进行监控,由此定位到视频哪一帧画面发生了“点击输入框,尝试调起键盘”: ?...,键盘调起、标识逐渐上升的过程(如下图),对每帧画面相应坐标处的颜色变化进行识别,以期得到此刻帧数: ?

    1.1K10

    【Flutter&Flame 游戏 - 叁】手势操作与键盘事件

    这里我们先来实现如下的效果: Y 键时,让角色以自身中心沿 y 轴 反转; X 键时,让角色以自身中心沿 x 轴 反转:代码 【03/01】 ---- 首先介绍一 Flame 对键盘事件的封装...true); } ---- 同理,结合上一章的内容,我们也可以通过键盘按键来控制角色的移动,如下所示,通过 上下左右 或 WSAD 键进行移动:代码 【03/02】 代码如下,其中 step 表示的偏移量...Flame 如何监听键盘事件,下面来看一手势事件,比如点击、拖拽、长按等。...---- 如下的小例子,每次点击屏幕时,角色会顺时针旋转 90° ,而且后会显示角色的边界信息,抬手后会消失。...那么如果只想对某个 Component 进行监听,又该怎么办呢?Flame 源码 components/mixin 中提供了 Component 专属的键盘、手势检测混入类。

    1.4K20

    【Java AWT 图形界面编程】使用小键盘按键缩放 Canvas 画布绘制的背景图像 ( 键盘按键监听 + 绘制超大图像 + 鼠标拖动 + 鼠标滚轮缩放 + 以当前鼠标指针位置为缩放中心 示例 )

    一、键盘按键监听 - 要点分析 ---- 如果要为 Java AWT 界面编程的应用设置键盘按键监听 , 必须为 Frame / JFrame 窗口设置键盘监听 , 为组件设置是无效的 ; 下面是设置键盘监听的核心代码..., 移动距离对应的缩放效果也随之缩小 ; 【Java AWT 图形界面编程】使用鼠标滚轮放大缩小 Canvas 画布绘制的背景图像 ( 鼠标滚轮事件监听器 MouseWheelListener...*; import java.awt.*; import java.awt.event.*; public class LargeCanvas extends JPanel { // 鼠标时的坐标...addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { // 记录鼠标时的坐标..., 数字键 9 , 放大 9 倍的效果如下 :

    1.8K20

    MarkdownPicPicker - Markdown图片上传助手

    接着右键快捷方式,属性,“快捷键” 这一栏字母Q,它将自动填充为 Ctrl + Alt + Q, 确定。 ?...只需要首先使用QQ截图或者其他截图工具将图片保存到剪贴板,然后下设定好的快捷键即可。Markdown格式的图片链接就已经保存到剪贴板中了。需要使用的地方直接粘贴。...全局键盘监听 本程序还有一个功能是全局监听键盘,通过特殊的快捷键组合就可以直接触发读取图片上传图片的操作。但是由于这个功能使用到了pyHook这个库。...获取键盘按键 如果不清楚某个键盘按键对应的字符串是什么样子的,可以运行QueryKey.py这个文件,运行以后某个键,控制台上就会显示相应的信息。...如图为键盘左Shift键以后显示的信息。 ? TODO 支持更多的截图方式 支持更多的图床 窗口隐藏 解决pyHook的问题 适配Linux 和 Mac OS

    75610

    python进阶——人工智能视觉识别

    当安装完成之后,我们就可以看到安装路径的这些文件:  里面包含眼睛识别,面部识别等一些强大的识别算法!...,控制判断按键: k = cv2.waitKey(1) & 0xFF 使用imshow函数显示拍摄图像: cv2.imshow('ceshi',Vshow) 键盘监听s键进行保存: if k ==...,我们要在pycharm或cmd的本文件根目录下使用命令行,安装face模块使用函数: pip install opencv-contrib-python 导入第三方库: import os import...(path,f) for f in os.listdir(path)] 加载分类器(就是我们上面讲到的opencv官网下载的库,我们只需要调取安装目录就可以): face_detector = cv2...('fs:',facesSamples) return facesSamples,ids 调用图片路径(有第一步抓取人脸后s键保存到'E:/tupian/'路径的图片): path = '

    29530

    【音视频连载-003】基础学习篇-SDL 消息循环和事件响应

    在前面的文章已经创建了一个 SDL 窗口并且显示指定的颜色。 为了让窗口显示出来,程序写了一个死循环,这几行代码就是 SDL 消息循环和事件响应的核心缩影了。... SDL 通过 SDL_PollEvent 从消息队列取出消息,如果有则返回 1,没用则返回 0。...同样的, SDL_WaitEvent 方法监听了 SDL_QUIT 类型的事件,当点击窗口左上角的叉时,也要退出循环,结束程序。...键盘响应 现在可以通过 SDL_Event 的事件类型来监听特定的键盘事件了。 键盘事件有 SDL_KEYDOWN 和 SDL_KEYUP 抬起两种类型,按需监听。...鼠标响应 除此之外还可以监听鼠标事件,比如鼠标是否、抬起、移动和坐标之类的。

    1.3K20
    领券