作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要在我的 Mac 上用 Python 编写的应用程序中监听全局鼠标事件(未绑定(bind)到应用程序)。
我正在使用 PyObjC,但我不知道该怎么做。普通 ObjC 示例或其他 Python 技术也很受欢迎。
到目前为止我的代码:
from Quartz import *
def MyFunction(proxy, type, event):
print event
CGEventTapCreate(kCGHIDEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction)
== 段错误
我知道我需要稍后将它添加到事件源,但我需要先让它工作。
[更新]
使用 PyObjC 形式的 Macports 解决了段错误,所以现在我这样写:
from Quartz import *
def MyFunction(p, t, e, c):
print e
tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap, kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction, None)
runLoopSource = CFMachPortCreateRunLoopSource(None, tap, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), runLoopSource, kCFRunLoopDefaultMode);
CGEventTapEnable(tap, True);
CFRunLoopRun();
但这只是永远运行并且不响应鼠标事件,有什么问题吗?
最佳答案
CGEventTapCreate 的第四个参数是CGEventMask eventsOfInterest
,您给它kCGEventLeftMouseDown
,它是_CGEventType
类型的枚举。您需要翻转位掩码中的适当位,而不是整数常量。您可以使用 CGEventMaskBit
所以不是这个:
tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction, None)
我们可以这样做:
tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly, CGEventMaskBit(kCGEventLeftMouseDown),
MyFunction, None)
或等同于:
tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly, (1 << kCGEventLeftMouseDown),
MyFunction, None)
关于python - 如何在 Mac 上用 Python 监听鼠标事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337196/
我是一名优秀的程序员,十分优秀!