keyhac でプログラムを実行する

keyhac v1.08 には shellExecute() という関数があるが、API リファレンス を読むと「この関数をメインスレッドで呼び出すことは出来ません。代わりに Job 機能などを使って、サブスレッドで呼び出すようにしてください。」などと書かれていて、どーすりゃいいのかわからない。作者さんに問い合わせたところ、実際にはサブスレッドを作らなくても使えるそうだ。
keyhac でホットキーランチャを実現するには、次のように「『shellExecute() を実行する関数』を返す関数」を自分で定義して、それを指定する。

# config.py
from keyhac import *
import re

def launch(path, param = u"", workdir = u""):
    if workdir == u"":
        workdir = re.sub(ur"\\[^\\]*$", ur"", path)
    def _launch():
        if path != u"":
            shellExecute(None, None, path, param, workdir, SW_NORMAL)
    return _launch

def configure(keymap):
	keymap_global = keymap.defineWindowKeymap()
	keymap_global["W-I"] = launch(ur"C:\Program Files\Internet Explorer\iexplore.exe")

この例では Win+[ I ] で IE が起動する。Win+[ E ] や Win+[ M ] もオーバーライドできる*1が、 Win+[ L ] だけはオーバーライドできないようだ*2
ちなみに、同じことを窓使いの憂鬱でやるとこんな感じ。

key W-I = &ShellExecute("open", "C:\\Program Files\\Internet Explorer\\iexplore.exe",,, ShowNormal)

同じことを AutoHotkey でやるとこんな感じ。

#i:: launch("C:\Program Files\Internet Explorer\iexplore.exe")
launch(cmdline, workdir = "") {
	run %cmdline%, %workdir%, , pid
	winwait ahk_pid %pid%, , 3
	winactivate ahk_pid %pid%
}

*1:エクスプローラを起動」や「すべてのウィンドウを最小化」といった Windows のキー割り当ては無効になる

*2:指定したアプリが起動した直後に「ユーザーの切り替え」が行われてしまう