1年とちょっと前の2025年の5月頃に、以下のWebの投稿を発見しました。それは2022年に書かれたものでした。
ダイソーで買った330円のテンキーを自分専用デバイスにカスタマイズする #Windows – Qiita
https://qiita.com/chromia/items/ecd4bccc8e2fa8061742
3年も遅れて、見つけたのはいまいちでしたが、こういうものを皆欲しがっていると即座に理解しました。そのときの「のどか」では、昔の WM_INPUTでの複数デバイス認識方式でしたので、キー入力しても少し遅れてから認識することになり、これではだめだと思いました。それからどうにかできないものか調べて、デバイスごとにドライバが割り当たれば、できるはずと開発に着手して、3か月ぐらい経って、去年の8月頃、約1年前ですが、kbdaddid.sysの原型は、動き出していました。そこからEV署名を取って、マイクロソフトにパートナー登録したりとか、しつつ、複数キーボード対応のデバイスドライバ+ LL Hookのもっとカジュアルな感じのキーリマップソフトを提供しようと考えていました。しかしながら、放置に近かった「のどか」も直さないとだめと思い、結局「のどか」を先に直して、それからkbdaddidという感じの順番になりました。
「のどか」を直している間に、Interception互換のOpenInputBridgeの開発も始めてしまいましたが、それも無事出来たので、今回初めて、先のダイソーのテンキーの話と同じことを実施できる運びとなりました。

ほぼ同じテンキーをTEMUで見つけたものとなります。900円近くと3倍もの値段の開きがありますが、ダイソーは大量に手配してあの値段を実現させたのだろうなと思います。さて、元のダイソーのテンキーの話では、Interceptionのデバイスドライバに、CのコードとPythonのコードを書いて実現させていましたので、Interception互換のOpenInputBridgeデバイスドライバを使って紹介できればと思ったのですが、CのコードはVisual Studioでそのままbuildできたけれども、PythonとPythonライブラリがきちんと動く環境じゃないと、実際には動作せず、そこでテンション切れてしまい断念しました。
「のどか」とkbdaddidも入れてあったので、各キーを押して何が入力されるか確認しながら、設定ファイルをちょいちょいと記述して、30分ぐらいで、どれかのキーを押したら、何か別のキーが出力されるというサンプルが動きました。
設定ファイルは以下です。
# 10key.nodoka
include "109.nodoka"
keymap Global
key C-A-D = &DescribeBindings # 現在のキーマップのログ出力
key C-F1 = &DescribeBindings # 現在のキーマップのログ出力
key 英数 = $ToggleIME
def option UnitID = K2 ExtraInfo 0xEA620000
# NumLock On
key K2-NumSolidus = n u m slash
key K2-NumAsterisk = n u m a s t e r
key K2-NumHyphenMinus = n u m m i n u s
key K2-Num7 = n u m _7
key K2-Num8 = n u m _8
key K2-Num9 = n u m _9
key K2-NumPlusSign = n u m S-Semicolon
key K2-Num4 = n u m _4
key K2-Num5 = n u m _5
key K2-Num6 = n u m _6
key K2-BackSpace = n u m b a c k s p a c e
key K2-Num1 = n u m _1
key K2-Num2 = n u m _2
key K2-Num3 = n u m _3
key K2-NumEnter = n u m e n t e r
tapdance K2-Num0 = tap1=z tap2= S-Z tap3=&Ignore
## key K2-Num0 = n u m _0 # tapdance K2_Num0とバッティング
key K2-NumFullStop = n u m p e r i o d
# NumLock Off
## key K2-NumSolidus
## key K2-NumAsterisk
## key K2-NumHyphenMinus
key K2-Home = n u m _7 _7
key K2-Up = n u m _8 _8
key K2-PageUp = n u m _9 _9
## key K2-NumPlusSign
key K2-Left = l e f t
##key K2-Num5 = &Ignore # キー出力無し
key K2-Right = r i g h t
## key K2-BackSpace
key K2-End = e n d
key K2-Down = d o w n
key K2-PageDown = p a g e d o w n
## key K2-NumEnter = n u m e n t e r
key K2-Insert = i n s e r t
## tapdance K2 Num0 = &Ignore # キー出力無し
key K2-Delete = d e l e t e
解説すると def option UnitIDからの行が、外部USBテンキーの定義となります。
外部テンキーは、K2に割り当てています。コメントでNumLock OnとNumLock Offとあるのは、それぞれ、NumLock有効時と、NumLock無効時では出力されるスキャンコードが異なるので、それぞれ記述しました。つまり2面あることになります。ただNumLock On/Offで同じコードを出すキーがあったり、NumLock Offではキー出力が無かったりするキーもあったので、それらのキーはNumLock Off側で、## を先頭に入れてコメントアウトしています。
数字キーの「00」は、ダイソーのテンキーの記事では「000」キーでしたが、私が入手したのは「00」と0を二回出力するものでしたので、最近「のどか」に機能追加した tapdanceの設定のダブルタップで実装しました。なおシングルタップでは、隣の「0」キーの出力を定義しています。もし入手されたテンキーが「000」キーがあるものであれば、トリプルタップの記述でリマップ設定できると思います。
ちなみに、このUSBキーボードは、NumLock Onモードでは、キーを押すたびに、そのキーを、NumLock OnとNumLock Offで挟んで出力します。しかしながら「のどか」の設定では、それに対する考慮が無いのは、何もする必要が無いためとなります。NumLock OnとOffでモードを解釈して、OnとOffとで同じキーを出す状態を区別して、使えるキーを追加することも可能と思いますが、それは実施していません。
初出では、上記のように書いたのですが、実際には実現不可でした。NumLock On状態でもNumLock Onを送るキーと送らないキーがあり、NL-(のどかでのNumLockモディファイヤ)では区別できませんでした。
上記サンプルの設定ファイルでは、key文の右辺は、ただ違うキーを押していることが分かるように実用的ではない記述となっています。例えばアプリごとに、ショートカット Ctrl + XXキーを押すみたいなものを記述すれば、自分向けのデバイスにすることが出来るだろうと思います。
例えば以下のサイトでは、普通のテンキーを左側のデバイスとして、Microsoft PowerToys KeyboardManagerで実現されています。これはノートPCとテンキーで違うキーのところだけ使う例となるので、「のどか」の場合に適用すると、kbdaddidのような複数キーボード対応機能は追加不要となります。使う人の考え方で工夫できるものだと思います。
外付けテンキーを左手デバイス化して便利になった話|Jan Undersson
https://note.com/jan_undersson/n/ne723504636b2#bd91a3dd-64be-4c15-8032-591e25f81d79
