昨日のコードで同じキーが表示されていたのは、System.Windows.Input.Key 列挙体に数値は同じで名前が違うものが含まれていたからでした。次のものが重なっているようですね。
値: キー名
6: Return, Enter
8: Capital, CapsLock
9: KanaMode, HangulMode
12: HanjaMode, KanjiMode
19: Prior, PageUp
20: Next, PageDown
30: Snapshot, PrintScreen
140: Oem1, OemSemicolon
145: Oem2, OemQuestion
146: Oem3, OemTilde
149: Oem4, OemOpenBrackets
150: Oem5, OemPipe
151: Oem6, OemCloseBrackets
152: Oem7, OemQuotes
154: Oem102, OemBackslash
157: OemAttn, DbeAlphanumeric
158: OemFinish, DbeKatakana
159: OemCopy, DbeHiragana
160: OemAuto, DbeSbcsChar
161: OemEnlw, DbeDbcsChar
162: OemBackTab, DbeRoman
163: Attn, DbeNoRoman
164: CrSel, DbeEnterWordRegisterMode
165: ExSel, DbeEnterImeConfigureMode
166: EraseEof, DbeFlushString
167: Play, DbeCodeInput
168: Zoom, DbeNoCodeInput
169: NoName, DbeDetermineString
170: Pa1, DbeEnterDialogConversionMode
値が重なっているキーの一覧を出力するコード。
Dim table = New Dictionary(Of Integer, List(Of String))
For Each keyName In [Enum].GetNames(GetType(Key))
Dim keyValue = CType([Enum].Parse(GetType(Key), keyName), Key)
If Not table.ContainsKey(keyValue) Then
table.Add(keyValue, New List(Of String))
End If
table(keyValue).Add(keyName)
Next
For Each item In From t In table Where t.Value.Count > 1
Console.WriteLine(item.Key.ToString & ": " & String.Join(", ", item.Value.ToArray))
Next
以上。
おまけ(本題?)。今後使うメソッド。Key列挙体からRegisterHotkey関数に必要な仮想キーの値を取得する方法。
KeyInterop.VirtualKeyFromKey(Key.A)
作りかけのコードを含むプロジェクトを破棄してしまいました……。