首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >macOS:用CGEventTap重写修饰符键

macOS:用CGEventTap重写修饰符键
EN

Stack Overflow用户
提问于 2021-09-16 19:08:47
回答 1查看 137关注 0票数 1

因此,我最近在我的macbook键盘上洒了些水,我的左边命令和选项键也不再起作用了。苹果公司希望我把它寄来修理,但我现在没有时间。所以我想我应该重写右边的命令键作为左控制,因为左边的命令键仍然有效。

我根据我发现的键盘记录器要点改编了以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>
#import <Carbon/Carbon.h>
#import <ApplicationServices/ApplicationServices.h>

CGEventRef loggerCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void* context)
{
    if (type == kCGEventFlagsChanged && CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode) == 54 /* right cmd key */) {
        printf(
            "TEST: %d %llu\n",
            type, 
            CGEventGetIntegerValueField(event, kCGKeyboardEventKeycode)
        );
        CGKeyCode virtualKey = 0x3B; // kVK_Control (left control);
        CGEventRef override = CGEventCreateCopy(event);
        CGEventSetIntegerValueField(override, kCGKeyboardEventKeycode, virtualKey);
        return override;
    }
    return event;
}

int main(int argc, const char * argv[])
{

    CFMachPortRef tap;
    if ((tap = CGEventTapCreate(kCGHIDEventTap,
                                              kCGHeadInsertEventTap,
                                              0, kCGEventMaskForAllEvents,
                                              loggerCallback, NULL)) == NULL) {
        printf("Failed ot create event tap\n");
        exit(1);
    }
    CFRunLoopSourceRef runLoopSource;
    if ((runLoopSource = CFMachPortCreateRunLoopSource(kCFAllocatorDefault, tap, 0)) == NULL) {
        printf("Failed to create run loop source\n");
        exit(1);
    }
    CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopCommonModes);
    CGEventTapEnable(tap, true);
    CFRunLoopRun();
    return 0;
}

现在,事件点击正常工作,它确实拦截键盘事件(我可以看到TEST 12 54打印到控制台),但键仍然是作为命令而不是控制。根据CGEventTapCallback,回调可能会返回:

一个新建的事件。在将新事件传递回事件系统后,将与原始事件一起释放新事件。

传入kCGHeadInsertEventTap作为点击位置应该确保我的事件点击被插入在处理程序列表的顶部。我是不是做错了什么,还是不可能修改这样的事件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-17 10:58:03

@Willeke的评论是正确的。虽然我正确地重写了事件,但我真正需要做的是使用keydown/keyup事件来跟踪何时按下正确的命令键。然后,我可以使用该标志来拦截其他按键事件,删除命令修饰符,并使用按位运算符插入控件修饰符标志。但是,解决这个问题的简单解决方案来自于他们提供的文档链接

hidutil property --set '{"UserKeyMapping":[{"HIDKeyboardModifierMappingSrc":0x7000000E7,"HIDKeyboardModifierMappingDst":0x7000000E0}]}'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69217301

复制
相关文章
MacOS VSCode快捷键[通俗易懂]
文章转载出处:http://www.cnblogs.com/informatics/
全栈程序员站长
2022/09/05
2K0
macOS 一键启动 AS 内置 AVD
通常我们使用 AS 自带的 AVD 都是通过 run 一个项目来自动启动它的,并且该 AVD 在外部也没有相应的启动快捷方式,本文就介绍一下 Win、Mac 等平台下如何通过简单配置从外部一键启动 AS 内置 AVD,希望对你有所帮助。
SkyRiN
2018/11/20
1.7K0
MacOS Monterey 一键重置系统
在新系统中,打开系统偏好设置应用,点击屏幕顶部菜单栏中的系统偏好设置,然后点击下拉菜单中的“抹除所有内容和设置”,就可以找到新的选项。当然,需要管理员密码才能继续将Mac恢复到出厂设置。
阿炬
2021/11/04
3K0
用“回车”键代替“Tab”键
编辑器加载中... //首先将窗体的 keypreview 的属性设为 true private void 窗体_KeyPress(object sender, KeyPressEventArgs e) { if ( e.KeyChar == (char)13 ) { this.SelectNextControl(this.ActiveControl, true, true, false, true); } } //或 private void Form1_KeyDown(object sende
跟着阿笨一起玩NET
2018/09/18
2.5K0
深入解析Java重写 - 返回值、修饰符必须一致?
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
用户7886150
2020/12/07
3170
深入解析Java重写 - 返回值、修饰符必须一致?
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
JavaEdge
2021/02/22
6320
macOS 用 Docker 安装 gogsDockergogs配置
Docker https://store.docker.com/editions/community/docker-ce-desktop-mac gogs https://github.com/gogits/gogs/tree/master/docker $ docker -v # 查看版本 Docker version 18.03.1-ce, build 9ee9f40 $ docker pull gogs/gogs # Pull image from Docker Hub. $ [sudo] mkd
iOSDevLog
2018/07/04
8520
在MacOs上用Docker开发
该文章介绍如何使用Docker在Mac上构建和运行Node.js应用程序。首先,介绍了Docker的基本概念和优势,然后详细说明了在Mac上使用Docker的开发流程。包括拉取Docker镜像、运行容器、管理容器和容器路径等。最后,探讨了Docker在软件开发和部署中的重要性,以及Docker在Mac上的实际应用场景。
花落花飞去
2017/12/27
4.1K0
>>开发工具:IDEA快捷键(Shortcuts: macOS)
当然了,具体的快捷键的操作还是每个人选择或配置的不一样而视情况而用,我当前所选择的快捷键方式如图配置:
艾特
2023/10/10
2140
>>开发工具:IDEA快捷键(Shortcuts: macOS)
tostring方法怎么用_重写toString方法
  本文将介绍toString()方法,toString()方法返回反映这个对象的字符串
全栈程序员站长
2022/09/20
1.1K0
如何在 macOS 中互换 Control 和 Command 键
习惯用Win电脑,猛然间使用Mac电脑,习惯不了Control键和Command键的位置,希望调换一下它们的位置 。如何在 macOS 中互换 Control 和 Command 键呢?小编为大家带来了详细的调换教程 ,有需要的朋友收藏起来吧!
用户10395188
2023/03/14
4.5K0
IDEA继承父类后重写方法快捷键
定 eg:我们的MyServlet继承了HttpServlet,我们想要重写里面的doGet()方法和doPost()方法,如何做到呢? public class MyServlet extends
全栈程序员站长
2022/11/15
1.4K0
IDEA继承父类后重写方法快捷键
MacOS下用CrossOver安装Enterprise Achitect
1、下载并安装CrossOver,下载地址 http://www.jb51.net/softs/580091.html#download
用户6288414
2020/07/02
1.1K0
python 用装饰器重写类的方法
def log_getattribute(cls): # Get the original implementation orig_getattribute = cls.getattribute
用户5760343
2019/12/12
1.4K0
用HTTP请求重写实现JSON CSRF
在该篇Writeup中,介绍了作者在某漏洞测试项目中发现JSON类型跨站请求伪造漏洞(Cross-Site Request Forgery,CSRF)的过程。
FB客服
2020/04/21
7850
用HTTP请求重写实现JSON CSRF
用Rust重写Linux内核,这可能吗?
众所周知,Linux 是 C 语言的代言人。但是,时代变了,Rust 正在兴起并赢得越来越多人的支持,它开始逐渐扮演 Linux 系统语言的角色。 在 2020 年 Linux Plumbers 峰会上,开发人员认真考虑过将 Rust 语言用于 Linux 内联代码的想法。此外,已经有很多 Linux 中的 Rust 内容被推向市场。比如,AWS 在 2020 年发布了 Bottlerocket,这是一种专为运行容器而打造的基于 Linux 的开源操作系统,其中包含大量的 Rust 代码。 另一个例子则与
深度学习与Python
2023/04/01
1.8K0
用Rust重写Linux内核,这可能吗?
Silverlight:用Enter键替换Tab键切换焦点
业务系统中,很多录入人员习惯于用Enter键来代替Tab键切换控件焦点(虽然我个人并不觉得这样录入速度会变得有多高效,呵呵),有需求了,自然就得想办法满足。 思路:为了更灵活的控件焦点顺序,我决定用TabIndex来做文章,每个输入控件按下回车时,找到下一个比当前控件TabIndex更大且最接近的控件,然后focus(). XAML界面部分: <UserControl x:Class="tab_key_test.MainPage" xmlns="http://schemas.microsoft.co
菩提树下的杨过
2018/01/24
2K0
macOS apache配置及开启虚拟服务器的开启,apache开启重写模式
今天把自己的mac系统升到最新版,但是,apache却不能用了,因为mac上的apache是系统自带的,因为是mac目前的最新系统,所以出现了好多问题,整理了一下午也没有啥进展,最后还是把原来的在云盘保存的文件放到指定的位置,文件在我博客的文件中可以下载,文件名为mac,apache服务器配置文件,里面包含3个文件,其中三个文件在这里共享:
lin_zone
2018/08/15
3K0
macOS  apache配置及开启虚拟服务器的开启,apache开启重写模式
用 Rust 重写网站,性能提升了18倍!
对于构建中小型网站/个人博客来说,Hakyll 是一个不错的静态网站生成器库,9 年前的 Jonas Hietala 正是选择了 Hakyll 编写博客网站。但随着时间的推移,网站出现各种问题,诸如速度越来越慢,许多外部依赖性,设置问题等,Jonas Hietala 决定用 Rust 重写。
非凸科技ft.tech
2022/09/06
5740
话说const修饰符与static修饰符
这也是面试和笔试中经常会考到的问题,特别是static我面试了四家就考了两家,但是一般会放在前两题,属于特别基础的题目了。
用户2617681
2019/08/08
9420

相似问题

CGEventTap + NSStatusItem问题

16

MacOS塞拉利昂-用XAMPP破坏brew重写PHP

12

用重写部分替换json键

10

用键/值对重写htaccess

25

Python CGEventTap总线错误

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文