【问题标题】:Something like pyHook on OS XOS X 上的 pyHook 之类的东西
【发布时间】:2012-06-15 05:20:33
【问题描述】:

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

【问题讨论】:

  • 刚刚编辑了演示文稿。 pyHook 可让您在 python 应用程序之外记录击键(仅在 Windows 上),例如,它通常用于键盘记录器。就我而言,我想建立跨操作系统的统计数据,关于鼠标活动、击键和窗口(数量、时间等)。 pyHook 非常适合在 Windows 上执行此操作,所以我试图弄清楚如何在 OS X 上执行此操作:)
  • 在 SO 上有几个有用的线程:但他们不讨论实际的库:stackoverflow.com/questions/3258312/…stackoverflow.com/questions/4809251/keyboard-input-on-osx
  • 非常感谢,我正在看;)

标签: python macos keylogger pyhook


【解决方案1】:

据我所知,没有用于此的 Python 库,因此您将调用本机 API。好消息是 PyObjC(在最近的操作系统版本中内置了 Python)通常可以让这变得简单。

有两个主要选项。要使其中任何一个工作,您的应用程序必须具有 Cocoa/CoreFoundation 运行循环(就像在 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)

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

还有一些其他方法可以达到同样的目的——例如,使用 DYLD_INSERT_LIBRARIES 或 SIMBL 将一些代码插入到每个应用程序中——但我想不出还有什么可以用纯 Python 完成的。

【讨论】:

  • 非常感谢您冗长而完整的回答!我会看看它并在这里与您保持联系;)
【解决方案2】:

一个可能的快速替代方案可能是这个

https://github.com/gurgeh/selfspy 它声称可以在 Mac 和 Windows 上运行。它基于windows部分的pyhook。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    相关资源
    最近更新 更多