4

私は実際に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

4

2 に答える 2

9

私の知る限り、このための Python ライブラリは存在しないため、ネイティブ API を呼び出すことになります。幸いなことに、PyObjC (最近の OS リリースでは組み込みの Python に付属しています) を使用すると、多くの場合それが簡単になります。

2 つの主要なオプションがあります。これらのいずれかが機能するには、アプリに Cocoa/CoreFoundation 実行ループが必要です (Windows と同様に、多くの場合、「コマンド ライン実行可能ファイル」ではなく「Windows GUI 実行可能ファイル」である必要があります)。ここで行う方法を説明しません。(方法がわからない場合は、Python で GUI アプリを作成するための適切なチュートリアルを見つけてください。それが最も簡単な方法だからです。)

簡単なオプションは、Cocoa グローバル イベント モニター API です。ただし、いくつかの大きな制限があります。別のアプリに送信されるイベントのみを取得します。つまり、メディア キー、グローバル ホットキー、および何らかの理由で無視されたキーは表示されません。また、「アクセシビリティについて信頼できる」必要があります。(これを行う最も簡単な方法は、システム環境設定のユニバーサル アクセス パネルで、グローバルにオンにするようにユーザーに依頼することです。)

ハード オプションは、Quartz イベント タップ API です。それははるかに柔軟であり、正確に適切な権限のみを必要とし (使用する設定によっては、アクセシビリティが信頼されているか、root として実行されているかが含まれる場合があります)、はるかに強力ですが、多くの時間がかかります開始するための作業が増え、間違った操作を行うと、システムを台無しにする可能性があります (たとえば、すべてのキーストロークとマウス イベントを食べて、OS にアクセスできず、電源ボタン以外で再起動できないなど)。

関連するすべての関数のリファレンスについては、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 で実行できる方法は他に思いつきません。

于 2012-06-12T20:42:09.233 に答える
0

可能な迅速な代替案はおそらくこれです

https://github.com/gurgeh/selfspy Mac と Windows の両方で動作すると主張しています。これは、Windows 部分の pyhook に基づいています。

幸運を。

于 2015-05-05T13:42:57.087 に答える