模拟kCGEventOtherMouseDown仅右键生效,左键无响应如何解决
问题原因
核心问题是事件类型与鼠标按钮参数不匹配:
kCGEventOtherMouseDown是专门用于中键、侧键等非左右键的额外鼠标按键事件类型,不属于左右键的标准事件范畴- 之前传入
kCGMouseButtonRight能生效属于系统的兼容性兜底,并非标准写法;替换为左键后事件类型校验不通过,因此功能失效,按键测试工具识别为中键也是因为使用了额外按键的事件类型。
正确实现方案
左右键有专门对应的事件类型,完整点击需要同时发送按下和抬起两个事件,缺一不可:
左键模拟代码
// 左键按下事件 auto leftDownEvent = CGEventCreateMouseEvent(nullptr, kCGEventLeftMouseDown, {x, y}, kCGMouseButtonLeft); CGEventSetIntegerValueField(leftDownEvent, kCGMouseEventClickState, 1); CGEventPost(kCGHIDEventTap, leftDownEvent); CFRelease(leftDownEvent); // 左键抬起事件(必须配套发送,否则不会被判定为一次有效点击) auto leftUpEvent = CGEventCreateMouseEvent(nullptr, kCGEventLeftMouseUp, {x, y}, kCGMouseButtonLeft); CGEventSetIntegerValueField(leftUpEvent, kCGMouseEventClickState, 1); CGEventPost(kCGHIDEventTap, leftUpEvent); CFRelease(leftUpEvent);
事件类型对应规则
| 按键类型 | 按下事件类型 | 抬起事件类型 | 按钮参数 |
|---|---|---|---|
| 左键 | kCGEventLeftMouseDown | kCGEventLeftMouseUp | kCGMouseButtonLeft |
| 右键 | kCGEventRightMouseDown | kCGEventRightMouseUp | kCGMouseButtonRight |
| 中键/侧键等额外按键 | kCGEventOtherMouseDown | kCGEventOtherMouseUp | 从2开始递增,2对应中键 |
补充注意事项
- 模拟双击时,将
kCGMouseEventClickState的取值设置为2即可 - macOS下模拟输入需要提前给应用开启辅助功能权限,路径为:系统设置 > 隐私与安全性 > 辅助功能,否则事件会被系统拦截
内容的提问来源于stack exchange,提问作者Nikita Demodov
相关产品推荐
相关产品推荐

