windowsでのキーマップ設定

AutoHotKey
- キーマップには制限があるっぽい。自分のしたいWin+Lを→に変換するのに影響ありそう
Limitation: AutoHotkey's remapping feature described below is generally not as pure and effective as remapping directly via the Windows registry. For the advantages and disadvantages of each approach, see registry remapping.
https://www.autohotkey.com/docs/v1/misc/Remap.htm#intro
- 変換のコードは簡単そう。下記でCapsLockをCtrlに変換できる。
CapsLock::Ctrl
複数入力の時の挙動はどうなる?

Crevice4
- C#スクリプトで記述する。ちょっと分かりづらい
- 多分やりたいことはconvert-a-button-or-a-key-into-an-arbitrary-oneに書かれてる
- これでXButton1をLWinキーにできるっぽい
// Convert Keys.XButton1 to Keys.LWin.
On(Keys.XButton1).
Press(ctx =>
{
SendInput.ExtendedKeyDown(Keys.LWin);
}).
Release(ctx =>
{
SendInput.ExtendedKeyUp(Keys.LWin);
});
でも修飾キーとして利用する場合はリピートできるOnDecomposedを利用して記述する必要があるっぽい
OnDecomposed(Keys.XButton1).
Press(ctx =>
{
SendInput.ExtendedKeyDown(Keys.LWin);
}).
Release(ctx =>
{
SendInput.ExtendedKeyUp(Keys.LWin);
});
修飾キーの挙動的に
Alt Alt Alt Alt Alt Alt Alt
みたいに連続で入力されているときにRを入力すると「Alt + R」のブロックができて「Alt + R」として解釈されるっぽい
Alt Alt Alt Alt Alt 「Alt + R」 Alt
Onで実装すると一回しか入力されないから多分同時入力受付の期間を過ぎて正しく動作しないってことだと思う。(なので正しく同時入力すれば動作するんだとは思うけど、わざわざOnで実装する必要もないね)

ひとまずいろんなソフト入れたくはないのでCreviceでなんとかできないか試してみる
いつもよく使う
macで設定している「RightCmd+;」をバックスペースにするのを実装してみる
windowsなので「RWin+;」をバックスペースにする
キーリストはcomplete-list-of-keysから確認できる
下記で実現できた
感覚としてはOnDecomposedのほうがRWinキーでOn側が;っぽいが
Onを押すと入力を受け付けが開始してその間にDecomposedで組み合わせが検知されるらしい
var Whenever = When(ctx =>
{
return true;
});
Whenever.
On(Keys.RWin).
OnDecomposed(Keys.OemSemicolon).
Press(ctx =>
{
SendInput.ExtendedKeyDown(Keys.Back);
}).
Release(ctx =>
{
SendInput.ExtendedKeyUp(Keys.Back);
});

次に「RWin+L」で「→」を実現する
これはWindowsの仕様でWin+Lが画面ロックにアサインされているのでうまくいかない可能性もある
上記と同じ感じで実装するとこうなる。
実行するとエラーにはならないが画面ロックが優先されてしまう
Whenever.
On(Keys.RWin).
OnDecomposed(Keys.L).
Press(ctx =>
{
SendInput.ExtendedKeyDown(Keys.Right);
}).
Release(ctx =>
{
SendInput.ExtendedKeyUp(Keys.Right);
});

KeyBoardManagerのページにWin+LはOSで予約されていると記載あった
ちょっとむずかしそう...

次に試すこと
- レジストリを変更してRWinを半角/全角キーに変換する
- 半角/全角+Lで→になるか確認

レジストリでRwinを半角/全角に変更することはできた
こちらを参考にした。
生成されたファイルの一部が間違っているっぽくて、キーの数の部分が最後の終了宣言も含むみたい。
そのため生成されたファイルのキーの数の部分を+1した
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,\
03,00,00,00,1D,00,3A,00,29,00,5C,E0,00,00,00,00

ここでCreviceで問題発生。
半角/全角のキーが設定できなそう...
こちらを参考にするとキーは0xF3のようだが、Creviceのドキュメントに記載がない

ここでAutoHotKeyへの切り替えの可能性が出てきた。
AutoHotKeyには存在することを確認
よく確認するとCreviceは現在更新されていなかったのでそういう意味でもAutoHotKeyでもよいかも

一方でAutoHotKeyでは修飾キーしか利用できないっぽいな...
一方Creviceでは普通のキーの組み合わせでもできるっぽい
やはりCreviceにしたほうがいいかも半角/全角の代わりに利用できるキーを選定する

無変換キーが使えそう。普段使っていないのでこのキーが使えなくなっても困らない。
レジストリを再度書き換えて半角/全角の部分を無変換に書き換えて
Google日本語入力のキー変換のところで無変換に該当するものを削除する(誤作動を防ぐため)
無変換とShift+無変換に対応するものがあった

無変換とかなモードで試したけど無理だった。
別の方法としてNumlockを指定する方法があった。
現在使っているキーボードはテンキーがついていないので代わりにつかってもOK。
実際に設定してみると「numlock + ;」がバックスペースになった。
当たり前だけどnumlock(RWin)キーを押すとnumlockのON/OFFのメッセージが出てきてしまうがショートカットのときだけなら表示されないのでギリ許容できる。
他の方法がないので一旦こちらでこの先の設定を進める。