Pep*_*ijn 9 python pyobjc objective-c mouseevent
我需要在用Python编写的应用程序中监听Mac上的全局鼠标事件(未绑定到应用程序).
我正在使用PyObjC,但我无法弄清楚如何做到这一点.简单的ObjC示例或其他Python技术也很受欢迎.
我的代码到目前为止:
from Quartz import *
def MyFunction(proxy, type, event):
print event
CGEventTapCreate(kCGHIDEventTap, kCGTailAppendEventTap, kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction)
Run Code Online (Sandbox Code Playgroud)
==分段错误
我知道我需要稍后将它添加到事件源中,但我需要首先使用它.
[更新]
使用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();
Run Code Online (Sandbox Code Playgroud)
但这只是永远运行而且不响应鼠标事件,有什么不对?
CGEventTapCreate 的第四个参数是CGEventMask eventsOfInterest,您给它的kCGEventLeftMouseDown是一个类型为 的枚举_CGEventType。您需要翻转位掩码中的相应位,而不是整数常量。您可以使用以下方法执行此操作CGEventMaskBit
所以代替这个:
tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly, kCGEventLeftMouseDown, MyFunction, None)
Run Code Online (Sandbox Code Playgroud)
我们做得到:
tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly, CGEventMaskBit(kCGEventLeftMouseDown),
MyFunction, None)
Run Code Online (Sandbox Code Playgroud)
或等价:
tap = CGEventTapCreate(kCGHIDEventTap, kCGHeadInsertEventTap,
kCGEventTapOptionListenOnly, (1 << kCGEventLeftMouseDown),
MyFunction, None)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2015 次 |
| 最近记录: |