2

文字列が与えられたら、その文字列を入力するための一連のキーストロークを送信できるようにしたいのですが、OSX上のPythonでそれを実行できるようにしたいです(Pythonですでに書かれているより大きなプロジェクトの一部であるため、Pythonで) 、OSXに移植しようとしているため、OSXで)。

私は今、このようにpyobjを使用してこれを行うことができます(これはやや単純化されています):

from Quartz import *

CHAR_TO_SEQUENCE = {
    'a':[(0, True), (0, False)]
}

def send_string(string):
    for c in string:
        sequence = CHAR_TO_SEQUENCE[c]
        for keycode, key_down in sequence:
            CGEventPost(kCGSessionEventTap, CGEventCreateKeyboardEvent(None, keycode, key_down))

CHAR_TO_SEQUENCEを具体化して、キーボードで入力できるもののほとんどを含めました。これには時間がかかり、面倒でした。

これに関する問題は次
のとおりです。-キーボードがANSII標準レイアウトである場合にのみ機能します。たとえば、誰かがフランス語のキーボードを使用すると、間違ったものを入力します。
-このばかげたテーブルが必要です。

OSXのこの一般的な解決策を見つけましたが、Pythonに適用する方法を理解できませんでした: ASCII文字をCGKeyCodeに変換する方法は?

そこに記載されているAPIは、pyobj経由では利用できないようです(または、インポートパスを理解できなかった可能性があります)。

キーコードを気にせずに、CGEventKeyboardSetUnicodeStringを目的の文字列に設定するためのいくつかの提案を見てきました。しかし、PythonからCGEventKeyboardSetUnicodeStringを呼び出す方法を理解できませんでした(引数を正しく取得できません)。ドキュメントには、アプリケーションがキーコードを優先してこれを無視することを選択できると記載されているため、これが機能するかどうかは明らかではありません。

OSXのPythonでこれを行う方法はありますか?

4

1 に答える 1

1

CarbonモジュールはTIS*関数をラップしておらず、他にも何もしていないようです。

PyObjCを拡張することもできますが、実際に必要な2つの関数をラップする簡単な拡張モジュールを作成する方がはるかに簡単です。

方法を説明するよりも実行する方が高速だったため、https://github.com/abarnert/pykeycodeから取得して、通常の「pythonsetup.pybuild_ext--inplace」または「sudo」を実行することができます。 python setup.py install」、次にtest.pyを見て使用方法を確認します。

于 2012-06-01T23:30:14.993 に答える