像是操作系统X上的pyHook

2024-05-19 00:20:44 发布

您现在位置:Python中文网/ 问答频道 /正文

实际上,我正在使用pyHook,但我也想为OS X编写程序。 如果有人知道这样一个模块。。。我上网看了一段时间,但没有什么真正相关的。

->;想法是能够在python应用程序之外记录击键。我的应用程序是一个社区统计构建器,因此从OS X获得统计信息也是非常好的。

提前感谢;)

编辑: PyHook:在python应用程序之外记录击键和其他事情 http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=PyHook_Tutorial http://pyhook.sourceforge.net/doc U 1.5.0网站/ http://sourceforge.net/apps/mediawiki/pyhook/index.php?title=Main_Page


Tags: apps应用程序httpindexnettitleos记录
2条回答

一个可能的快速选择也许这个

https://github.com/gurgeh/selfspy 它声称可以在mac和windows上工作。它基于windows部分的pyhook。

祝你好运。

据我所知,这里没有Python库,所以您将调用本机api。好消息是PyObjC(在最近的操作系统版本中随附了内置的Python)常常使这一点变得容易。

有两个主要的选择。为了让这两种方法都能工作,你的应用程序必须有一个Cocoa/CoreFoundation运行循环(就像在Windows中一样,很多事情都要求你是一个“Windows GUI可执行文件”,而不是“命令行可执行文件”),这里我不解释怎么做。(如果您不知道如何使用Python构建GUI应用程序,可以找到一个很好的教程,因为这是最简单的方法。)

简单的选项是Cocoa全局事件监视API。然而,它有一些主要的局限性。你只会得到指向另一个应用程序的事件——这意味着媒体密钥、全局热键和出于任何原因被忽略的密钥都不会显示出来。此外,你还需要“信任可访问性”。(最简单的方法是要求用户在系统首选项的“通用访问”面板中全局打开它。)

硬选项是Quartz事件tap API。它更加灵活,只需要完全正确的权限(这取决于您使用的设置,可能包括受信任的可访问性和/或以根用户身份运行),而且功能更强大,但是需要做更多的工作才能开始,如果您弄错了,可能会使您的系统崩溃(例如。,通过吃掉所有的击键和鼠标事件,这样它们就永远无法进入操作系统,并且你不能重新启动,除非用电源按钮)。

有关所有相关函数的引用,请参见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开始)。然而,碳是过时的,除此之外,从Python中获取碳更为困难,所以除非你有特定的理由这样做,否则不要

还有其他一些方法可以达到相同的目的,例如,使用DYLD_INSERT_库或SIMBL将一些代码插入到每个应用程序中,但是我想不出在纯Python中还能做什么。

相关问题 更多 >

    热门问题