はじめに
約1年半前、私はHP Mini 110-3155srの誇り高い所有者になりました。 マシンはみんなを喜ばせましたが、時間の経過とともにますます悩まされる問題が1つありました。Home、End、PgUp、PgDownの各ボタンの欠如です。 この問題を小さなPythonプログラムでどのように解決したかについて-猫の下で。
解決策はすぐに思い浮かびます。 ボタンがない場合は、ボタン用のホットキーを作成する必要があります。 システムツールを使用してこれを行う方法を見つけられなかったため、この種のさまざまなプログラムを整理し始めました。 そのようなプログラムが本当にたくさんあるという事実にもかかわらず、私は私に合ったものを見つけませんでした。 ホットキーでコマンドを実行することを提案する人もいれば、便利なキーボードショートカットをまったく見つけられない人もいました。
最終的に、私は自分で小さなユーティリティを書くことにしました。 さらに、Pythonの「火のバプテスマ」として良いアイデアになりました。最近教え始めたのですが、そのようなことを(もしあったとしても)どれくらい早くできるかがおもしろくなりました。
問題の声明
そのため、いくつかのキーを押すことに応答し、他のキーを生成するプログラムを作成する必要があります。 私の特定のケースでは、Home、End、PgUp、PgDownの4つのボタンのみのクリックを生成する必要があります。 多数の可能な組み合わせを並べ替え、既存の重要なものを破棄した後、Alt +矢印の組み合わせで停止することにしました。
- Alt +左==ホーム
- Alt +右==終了
- Alt + Up == Page Up
- Alt + Down == Page Down
何を使用していますか?
Python 2.7-このバージョンは十分にサポートされており、検証できました。
Python for Windowsエクステンション(ビルド216) -WinAPIを使用するため。
pyHook 1.5.1-システムフックを使用するための便利なラッパー。
py2exe 0.6.9 (オプション)-スタンドアロンの実行可能ファイルを作成します。
ソリューションのアイデア
一般的な考え方は非常に単純です。システムフックを掛け、クリックを追跡します。 Alt +矢印を押すと、ボタンを押すことに関する対応するシステムメッセージが生成されます。
ジンジャーブレッドのクッキーとレーキ
- 特別な注意が必要なポイントがいくつかあります。
- Altキーは、押された場合、押されたボタンに関する他のシステムメッセージが「システム」になるという点で、他のキーとは異なります。 これは、矢印を押すことに関するメッセージから直接、Altボタンが現在押されているかどうかを確認できることを意味します。
- ビオラを押しながらPgUpボタンを押しても、何も起こりません。 同様に、システムメッセージが生成されます。 方法は簡単です。生成前にプログラムでAltを「リリース」し、その後「プレス」します。
- 各ボタンの(キーストローク)を押すと、2つのメッセージが生成されます-押す(キーを押す)と放す(キーを押す)。 それらを区別する価値があります。そうしないと、1回のキーストロークで必要なボタンを押すシミュレーションが2回行われます。
- メッセージ処理関数はTrueまたはFalseを返し、これに応じて、メッセージは他のシステムフックのチェーンに渡されるかどうかが決まります。 このようにして、システムメッセージのフローを制御できます。
プログラムコード
# -*- encoding:cp1251 -*- import pythoncom, pyHook, win32api, win32con # def OnKeyboardEvent(event): # ... if event.Key == 'Lmenu': # ... , ... if event.MessageName[-2:] == 'up': # ... ... win32api.keybd_event(win32con.VK_MENU, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) # ... return False # - , if not(37 <= event.KeyID <= 40 and event.MessageName == 'key sys down'): return True # - # , , , "" win32api.keybd_event(win32con.VK_MENU, 0, win32con.KEYEVENTF_EXTENDEDKEY | win32con.KEYEVENTF_KEYUP, 0) # if event.KeyID == 38: win32api.keybd_event(win32con.VK_PRIOR, 0, 0, 0) elif event.KeyID == 40: win32api.keybd_event(win32con.VK_NEXT, 0, 0, 0) elif event.KeyID == 37: win32api.keybd_event(win32con.VK_HOME, 0, 0, 0) elif event.KeyID == 39: win32api.keybd_event(win32con.VK_END, 0, 0, 0) # "" win32api.keybd_event(win32con.VK_MENU, 0, win32con.KEYEVENTF_EXTENDEDKEY, 0) # , return False # HookManager hm = pyHook.HookManager() # hm.KeyAll = OnKeyboardEvent # hm.HookKeyboard() # pythoncom.PumpMessages()
結果
このようなプログラムは、人生を本当に簡素化しました。 確かに、それは「完全に」機能しません。
まず、Altボタンは完全な機能を失いました。アプリケーションメニューにアクセスするだけでは機能しなくなります。 ただし、同じAlt + F4は正常に機能します。 ただし、メインシステムのすべてのホットキーは既にビジーであるため、いずれにせよ何かを犠牲にしなければなりませんでした。
次に、次のバグが発見されました。Alt+ Tabの組み合わせは機能しますが、Altボタンを離してもスイッチウィンドウは消えません。 これまでのところ、これを修正する方法がわかりません。誰かが教えてくれることを願っています。
結論
グローバルな結論は「Python is cool」です(これはpythonで書いた最初のものです)。 実際、必要なライブラリは2クリックで簡単にインストールできます。 すでに他の人が書いたものを簡単に使用できるのは素晴らしいことです。
小さい結論はpyHookに直接関連しています-パッケージは非常に便利です。 それを適用する方法については、いくつかのアイデアがすでに現れています。
- カーソルの動きに基づいて、マウスが移動する距離(1時間あたり、1日あたり、観測時間全体)、平均速度などを決定します(たとえば、1ピクセル〜1 mm)。
- 出力に通常のキーボードのキーフックをある種のログファイルに書き込みます(私は長い間スパイのように感じたかったのです:))。
- スピーチの周波数辞書を作成します。 実際、同じキーフックで、個々の文字を組み合わせて単語にし、その頻度をカウントします。 アイデアは、 Skiminokとの長い通信に触発されて
盗まれました-彼はQIP用の同様のプラグインを作成しました。
UPD: lxydは、上記のすべてにAutoHotkeyが存在することを提案しました。 この記事は、「誰にも使えない自転車を発明した方法」というスタイルで判明しました。