キー割り当てソフト「LuaMacros」の導入

#導入した理由
ショートカットキーをUSBテンキーに割り当てて楽したい。
ということで「ショートカットキー割り当て」を目的として最終的にLuaMacrosにたどり着いたが、
メジャーなAutoHotKeyなどと比べて日本語文献が少ないので、備忘録もかねて記載。

##LuaMacrosに至った経緯

・要望
今回はUSBテンキーにショートカットを割り当てたい訳で、メインのキーボードに影響は出したくない。
　→デバイスごとに設定を分けられることが要件の一つ。

**①AutoHotKey** (https://www.autohotkey.com/)
　→ 調べた感じ有名みたいだし情報いっぱいあるじゃん!
　　キーボードごとに設定を分けられないようなので諦め

**②HidMacros** (http://www.hidmacros.eu/news.php)
　→ キーボードごとに設定できるし情報いっぱいあるじゃん!
　　と思ったら2015年に息絶えていた
　　``` 5.4.2015 - HidMacros is dead. Welcome LuaMacros```
 　　
**③LuaMacros**
LuaMacrosは上記「HidMacros」の後継として開発されている様子なので今回はこちらを使用する。

#LuaMacrosのダウンロード

http://www.hidmacros.eu/forum/viewtopic.php?f=10&t=241#p794
「LuaMacros download link」からLuaMacrosをDLする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594444/7791bb20-6341-7165-f50e-ec618a946911.png)


#LuaMacrosの起動
Zipを解凍すると「LuaMacros.exe」があるので実行する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594444/13862173-6a97-661e-7ead-396067b6c755.png)

Windows10の場合、初回のみ警告ウィンドウが表示されるが、
「詳細情報」をクリックして「実行」をクリックすれば実行できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594444/15b0c094-a330-3465-71c8-605c83362286.png)

#LuaMacrosの操作
・注意事項
以下に記載する内容は通常使うキーボードとは別に「USB接続のテンキー」を接続し、
そちら側に任意のショートカットを割り当てたときの作業になります。

「メインのキーボードにあるCapsLockにショートカット割り当てたい」といった内容ではないため、
その場合は自己責任で読み替えるか、別の情報元を漁ってください。

あと解説内容が間違っててもゆるして (´・ω・｀)


##使用するデバイス情報の特定
<font color=red>※使用したいキーボード(もしくはUSBテンキー等)が接続されている場合、いったん取り外しておく。</font>

LuaMacros上部にあるエディタ(?)に以下の文字列を入力し、再生ボタンをクリックする。

```
lmc_print_devices()
```

するとウィンドウ下部に現在使用可能なデバイスの一覧が表示されるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594444/f5392975-e3cb-21a2-cee2-c017c3e5976c.png)

そして、使用したいキーボードを接続してからもう一度再生ボタンをクリックする。
ここで出た結果を先ほどの結果と比べると、今回は「\\\?\HID#VID_05A4~」という行が増えているので、
これが使用したいキーボードであると判別できる。(文字列はデバイスごとに異なる)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594444/ae30a853-0fe4-8f5b-811e-c4daa8c5ff9d.png)

キーボードの特定ができたら、今後必要となるデバイス情報を確認する。
使用したいキーボード情報の行内に0が複数並んでいる場所がある。
「\\\?\HID#VID_05A4&PID_3002&MI_00#7&1FBF1CD5&```0&0000#```{884B96C3-56EF-11D　～」

その直前に&で挟まれたアルファベットと数字があり、これが後に必要になるためどこかにメモしておく。
「\\\?\HID#VID_05A4&PID_3002&MI_00#7&```1FBF1CD5```&0&0000#{884B96C3-56EF-11D　～」

##スクリプトの記述

今回のスクリプト(サンプル)では、以下の想定で設定を行う。
　1. USB接続のテンキーにあるアスタリスク(＊)キーに対し「Alt + Tab」を割り当てる  (ウィンドウ切り替え)
　2. USB接続のテンキーにある「数字の5」キーに対し「Ctrl + Shift + T」を割り当てる (chromeで閉じたタブを開きなおす)
　3. とりあえず動けば良いのだ (手抜き)
　
実際に記載した内容は以下の通り。

```
lmc_device_set_name("SubKeys","1FBF1CD5")

lmc_set_handler("SubKeys",function(button,direction)
  if (direction == 1) then return end
  if (button == 106)  then
      lmc_send_keys("%{TAB}",50)
  else if (button == 101) then
     lmc_send_keys("^+T",50)
  end
end
end
)
```


---------------

以下ざっくりと解説。 (コピペ改造で作ったので全部は分かってないけど)

```
lmc_device_set_name("SubKeys","1FBF1CD5")
```
使用するデバイスの指定。ここで前にメモっていた文字列を使う。
「lmc_device_set_name("任意の名称","メモした文字列")」

サンプルコードで言えば
「"1FBF1CD5"のデバイス(キーボード)を使用し、そのデバイスを今後"SubKeys"という名称で取り扱う」
といった形。


------------------

```
lmc_set_handler("SubKeys",function(button,direction)
 ~処理内容~
end
)
```
処理を行う本体。
「lmc_set_handler("最初に記載した任意の名称",function(button,direction)」

サンプルコード内では
「"SubKeys"のデバイスに対し、後述の処理を行う」

-------------

```
  if (direction == 1) then return end
```

この一文を入れない場合はキー押しっぱなしにする = 連打扱い(?)になる。
今回は「キー押しっぱなしで入力し続けてほしくない」ので記載。

-------

```
  if (button == 106)  then
      lmc_send_keys("%{TAB}",50)
  else if (button == 101) then
     lmc_send_keys("^+T",50)
  end 
```

if文に記載されている"106"と"101"はキーコードであり、
106はテンキーの「*」101はテンキーの「Num5」を表している。
どのキーがどの数字なのか分からない場合は、判別サイト( https://keycode.info )などで確認できる。
もしくは一覧( http://musou.s38.xrea.com/mQuery/keycode.html ) を検索するとか

lmc_send_Keysに書かれている「%{TAB}」の%はAltキーを示している。(キーコードとはまた別)
 "+"がShift、"^"がCtrlなど。{TAB}はそのままTABキーの意味。
これに関してはMicrosoftのSendKeysメソッドにある一覧が使えると思う。多分
https://docs.microsoft.com/ja-jp/previous-versions/windows/scripting/cc364423(v=msdn.10)?redirectedfrom=MSDN



まとめると、サンプルコード内では
「もし、106キー(テンキー＊)が押された場合、
　　Alt + TAB キーを入力しろ
　そうではなく、101キー(テンキー5)が押された場合、
　　Ctrl + Shift + T キーを入力しろ
おわり」

という感じ。



##スクリプトの実行
スクリプトを書き終わったら再生ボタンで実行。
エラーがあればウィンドウ下部にメッセージが出るので、出なければ成功。出たら要修正。
後は設定したキーを押して動作するかを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/594444/0dbf988a-61e1-4d17-d703-189754606476.png)



###メモ：エラーで詰まった点 (備忘録)
2020-02-29 16:38:23:097 [LUA] ERROR: Cannot load buffer.[string "LuaMacros script"]:11: unexpected symbol near ')'

記載されている行数付近にある)の前にendを一つ追加とだいたい解決する。

#スクリプトの保存
忘れてたので後日追記する


#参考情報

・AMG Tutorial // $10 DIY Streamdeck using LUA Macros
https://www.youtube.com/watch?v=_cAJ0j3E5xs

・困ったときの公式Wiki
https://github.com/me2d13/luamacros/wiki