Pythonで僕だけのキーボードショートカットを生み出す
前説
最近キーボードショートカットを覚えることにハマっています。 案外なんでもキーボードだけで出来ることに気づいた僕はこんなことを考え始めました。
「ブラウザの起動をキーボードに割り当てられないかな?」
INF回やる操作なのに毎回カーソルをタスクバーまでもっていくのが面倒になってしまいました。 ちょうど某で使っていたwxPythonが使えそうだということで僕だけのキーボードショートカットを生み出すことにしました。
コード解説
まずは作成したPythonコードから
import wx import webbrowser import subprocess class MyFrame(wx.Frame): def __init__(self): super(MyFrame, self).__init__(None) # virtualKeyCode https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes # Alt + ↑にブラウザの起動 id = wx.NewIdRef() self.RegisterHotKey(id, wx.MOD_ALT, virtualKeyCode=38) self.Bind(wx.EVT_HOTKEY, self.openBrowser, id=id) # Win + F4にVPN設定画面の起動 id = wx.NewIdRef() self.RegisterHotKey(id, wx.MOD_WIN, 115) self.Bind(wx.EVT_HOTKEY, self.openVpnClient, id=id) def openBrowser(self, event): webbrowser.open("https://google.com") def openVpnClient(self, event): subprocess.Popen(r"C:\Program Files (x86)\Cisco\Cisco AnyConnect Secure Mobility Client\vpnui.exe") if __name__ == "__main__": myFrame = wx.App() MyFrame() myFrame.MainLoop()
wxPythonのFrameクラスを継承してMyFrameクラスを作成しています。
MyFrameのコンストラクタではRegisterHotKeyからキーボードショートカットの登録、Bindから登録したキーボードショートカットへのイベントハンドラの設定を行っています。
KeyCodeは確認したくなったときにすぐ見られるようにコメントでペタリしてあります。
38は↑、115はF4です。
イベントハンドラ内では受け取っている引数のwx.Eventであれやこれやができますが、今回作成したopenBrowserではwebbrowser.open()を叩いているのみになっています。
登録するショートカットが1つではつまらないので、ついでにこれまた在宅勤務になってINF回起動するVPNのアプリにキーボードショートカットを設定しておきます。
あとはmainからこれを呼び出してあげるだけです。
wx.App()を使っているのはwxPythonのお決まりの書き方なので、よくわからなければおまじないだと思ってもらえれば。
このwxPythonのホットキーを用いる方法は実行中のプロンプトがフォアグラウンドになくても使えるので、キーボードショートカットを作成するのに向いています。 逆にほかのアプリを使用中にはこのキー入力がwxPythonに吸われてしまうため、Ctrl + CでコピーといったFrameに対する操作を実装するのには向いていないように思います。
キーボードショートカットを常駐させる
キーボードショートカットを作ったからには常にこのキーボードショートカットを使える状態にしておきたいです。
しかし、その目的を考えるとPythonコードは不向きです。
そこでPyinstallerを用いてPythonのコードをexe化します。
こうしてできたexeファイルをスタートアップに登録してあげることで、このキーボードショートカットを常駐させることができます。
ここでスタートアップに登録する際にexeファイルそのものではなく、そのショートカットを登録することで新しくキーボードショートカットを追加したいときもexe化まで行えばいいためお勧めです。
まとめ
今回はwxPythonを用いてキーボードショートカットを作成しました。 もとはといえば、Ctrl + Cでコピーを実装するべくググっていたら見つけた代物だったのですが、これはこれで必要としていたものだったので棚からぼたもちといったところです。 割と実用的なのでQiitaに書こうかとも思ったのですが、書いてるうちにポエムが長くなってしまったのでこっちに。