LoginSignup
5
6

More than 5 years have passed since last update.

Clojure/Javaでショートカットキー(Global Hotkey)を作る

Posted at

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 とKeyEventVK_*の組み合わせなどができます。

クリップボードを取得するプログラムと組み合わせるといろんな作業の定型化で楽できそうな予感がします。

5
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
6