像OS X上的pyHook之类的东西

Car*_*to_ 4 python macos keylogger pyhook

我实际上正在使用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

aba*_*ert 9

据我所知,没有Python库,因此您将调用本机API.好消息是PyObjC(在最近的OS版本中附带了内置的Python)经常使这很容易.

有两个主要选择.要使其中任何一个工作,你的应用程序必须有一个Cocoa/CoreFoundation runloop(就像在Windows中一样,很多东西要求你成为"Windows GUI可执行文件"而不是"命令行可执行文件"),我赢了解释怎么做这里.(如果你不知道怎么做,找一个用Python构建GUI应用程序的好教程,因为这是最简单的方法.)

简单的选择是Cocoa全局事件监视器API.但是,它有一些主要的局限性.您只能获取转到另一个应用程序的事件 - 这意味着媒体密钥,全局热键以及因任何原因而忽略的密钥都不会显示.此外,您需要"信任可访问性".(最简单的方法是要求用户在"系统偏好设置"的"通用访问"面板中全局启用它.)

硬选项是Quartz事件抽头API.它更加灵活,它只需要恰当的权限(根据您使用的设置,可能包括信任可访问性和/或以root身份运行),并且它的功能更强大,但需要很多更多的工作要开始,如果你弄错了就可能搞砸你的系统(例如,通过吃所有击键和鼠标事件,所以他们永远不会进入操作系统,除了电源按钮你不能重启).

有关所有相关功能的参考,请参阅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)
Run Code Online (Sandbox Code Playgroud)

另一个与Quartz事件大致相同的选项是Carbon事件(从InstallEventHandler开始).然而,Carbon已经过时,而且最重要的是,从Python中获取它是比较困难的,所以除非你有一些特定的理由这样做,否则不要.

还有其他一些方法可以达到相同的目的 - 例如,使用DYLD_INSERT_LIBRARIES或SIMBL将一些代码插入到每个应用程序中 - 但我想不出任何其他可以在纯Python中完成的事情.