像OS X上的pyHook之类的东西

时间:2012-06-12 10:26:21

标签: 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

2 个答案:

答案 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。

祝你好运。