我实际上正在使用 pyHook ,但我也想为OS X编写程序。 如果有人知道这样的模块......我一直在网上看一段时间,但没有什么真正相关的。
- >这个想法是能够在python应用程序之外记录击键。我的应用程序是社区统计构建器,因此从OS X获取统计信息也很棒。
提前致谢;)
修改: PyHook:在python应用程序之外记录击键和其他内容 http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial http://pyhook.sourceforge.net/doc_1.5.0/ http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=Main_Page
答案 0 :(得分:9)
据我所知,没有Python库,因此您将调用本机API。好消息是PyObjC(在最近的OS版本中附带了内置的Python)经常使这很容易。
有两个主要选择。要使其中任何一个工作,你的应用程序必须有一个Cocoa / CoreFoundation runloop(就像在Windows中一样,很多东西要求你成为“Windows GUI可执行文件”而不是“命令行可执行文件”),我赢了解释怎么做这里。 (如果你不知道怎么做,找一个用Python构建GUI应用程序的好教程,因为这是最简单的方法。)
简单的选项是Cocoa全局事件监视器API。但是,它有一些主要的局限性。您只能获取转到另一个应用程序的事件 - 这意味着媒体密钥,全局热键以及因任何原因而忽略的密钥都不会显示。此外,您需要“信任可访问性”。 (最简单的方法是让用户在系统偏好设置的Universal Access面板中全局启用它。)
硬选项是Quartz事件抽头API。它更加灵活,它只需要恰当的权限(根据您使用的设置,可能包括信任可访问性和/或以root身份运行),并且它的功能更强大,但需要很多更多的工作要开始,如果你弄错了就可以搞砸你的系统(例如,通过吃掉所有击键和鼠标事件,这样他们就不会进入操作系统,除了电源按钮你就无法重启)。 / p>
有关所有相关函数的参考,请参阅https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/nsevent_Class/Reference/Reference.html(对于NSEvent)和https://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html(对于Quartz事件)。一些谷歌搜索应该在Objective C(对于NSEvent)或C(对于CGEventTap)中提供大量示例代码,但在Python中很少或没有,所以我将展示一些小片段,说明你如何移植样本到Python:
import Cocoa
def evthandler(event):
pass # this is where you do stuff; see NSEvent documentation for event
observer = Cocoa.NSEvent.addGlobalMonitorForEventsMatchingMask_handler_(NSKeyDown, evthandler)
# when you're done
Cocoa.NSEvent.removeMonitor_(observer)
import Quartz
def evthandler(proxy, type, event, refcon):
pass # Here's where you do your stuff; see CGEventTapCallback
return event
source = Quartz.CGEventSourceCreate(Quartz.kCGEventSourceStateHIDSystemState)
tap = Quartz.CGEventTapCreate(Quartz.kCGSessionEventTap,
Quartz.kCGHeadInsertEventTap,
Quartz.kCGEventTapOptionListenOnly,
(Quartz.CGEventMaskBit(Quartz.kCGEventKeyDown) |
Quartz.CGEventMaskBit(Quartz.kCGEventKeyUp)),
handler,
refcon)
另一个与Quartz事件大致相同的选项是Carbon事件(从InstallEventHandler开始)。然而,Carbon已经过时了,而且最重要的是,从Python中获取它是比较困难的,所以除非你有一些特定的理由这样做,否则不要。
还有其他一些方法可以达到相同的目的 - 例如,使用DYLD_INSERT_LIBRARIES或SIMBL将一些代码插入到每个应用程序中 - 但我想不出任何其他可以在纯Python中完成的事情。
答案 1 :(得分:0)
可能的快速替代方案
https://github.com/gurgeh/selfspy 它声称可以在mac和windows上工作。它基于windows部分的pyhook。
祝你好运。