Clojure/Javaでお手軽にGlobal Hotkey(フォーカスなくても動くショートカットキー)を作るにはJKeyMasterが便利です。
※ClojureでラップしたKeymaster-cljもありますが、バージョン0.1.0だとバグっててresetしたときにハングします
JavaのサンプルはJKeyMasterのページにあるのでClojureのサンプルを作ってみます。
依存設定は[com.github.tulskiy/jkeymaster "1.1"]
です。
hotkey.clj
(ns hotkey.sample
(:import [com.tulskiy.keymaster.common Provider HotKeyListener]
[javax.swing KeyStroke]))
(def provider (atom nil))
(defn- get-arity [f]
(let [^java.lang.reflect.Method m (-> f class .getDeclaredMethods first)]
(count (.getParameterTypes m))))
(defn- ^HotKeyListener make-listener [f]
(reify HotKeyListener
(onHotKey [this hotKey] (apply f (take (get-arity f) [hotKey])))))
(defn register [^String key-code f]
(when (nil? @provider)
(reset! provider (Provider/getCurrentProvider true)))
(let [^Provider p @provider]
(.register p (KeyStroke/getKeyStroke key-code) (make-listener f))))
(defn reset []
(when-let [^Provider p @provider]
(.reset p)
(.stop p)
(reset! provider nil)))
これを使うと(register "ctrl shift 1" #(println %))
のようにしてキーが登録できます。
※get-arity
で関数の引数の数を算出しているのは引数が0個の関数と1個の(hotKeyが渡される)関数の両方を使えるようにするためです。
使えるキーはjavax.swing.KeyStrokeを見るとわかります。
shift | control | ctrl | meta | alt | altGraph とKeyEventのVK_*
の組み合わせなどができます。
クリップボードを取得するプログラムと組み合わせるといろんな作業の定型化で楽できそうな予感がします。