私の知る限り、このための 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 で実行できる方法は他に思いつきません。