工場向けの案件でキーボード入力タイプ(HID)のバーコードリーダを使用することがあります。
キーボードフックを使用してバーコード入力を取得するようにしていたのですが、取得したキーコードでは押されたキーが分かるだけなので、実際にはShiftキーやCtrlキーとのコンビネーションによって、キーコードから文字に変換する必要があります。
今までこの実装を適当に行っており、Shiftキーによる変換があまりできておらず、正しく読めない記号がありました。
今回、実装を見直しまして、ほぼ全てのパターンを網羅できたと思います。
以下がShiftキーを考慮した文字変換です。
return KeyCode switch {
(int)Keys.Multiply => '*',
(int)Keys.Separator => '|',
(int)Keys.Add => '+',
(int)Keys.Subtract => '-',
(int)Keys.Decimal => '.',
(int)Keys.Divide => '/',
(int)Keys.Oemplus => shift ? '+' : ';',
(int)Keys.Oemcomma => shift ? ' shift ? '=' : '-',
(int)Keys.OemPeriod => shift ? '>' : '.',
(int)Keys.Oem1 => shift ? '*' : ':',
(int)Keys.Oem2 => shift ? '?' : '/',
(int)Keys.Oem3 => shift ? '`' : '@',
(int)Keys.Oem4 => shift ? '{' : '[',
(int)Keys.Oem5 => shift ? '|' : '\\',
(int)Keys.Oem6 => shift ? '}' : ']',
(int)Keys.Oem7 => shift ? '~' : '^',
(int)Keys.Oem102 => shift ? '_' : '\\',
(int)Keys.NumPad0 => '0',
(int)Keys.NumPad1 => '1',
(int)Keys.NumPad2 => '2',
(int)Keys.NumPad3 => '3',
(int)Keys.NumPad4 => '4',
(int)Keys.NumPad5 => '5',
(int)Keys.NumPad6 => '6',
(int)Keys.NumPad7 => '7',
(int)Keys.NumPad8 => '8',
(int)Keys.NumPad9 => '9',
(int)Keys.D0 => '0',
(int)Keys.D1 => shift ? '!' : '1',
(int)Keys.D2 => shift ? '"' : '2',
(int)Keys.D3 => shift ? '#' : '3',
(int)Keys.D4 => shift ? '$' : '4',
(int)Keys.D5 => shift ? '%' : '5',
(int)Keys.D6 => shift ? '&' : '6',
(int)Keys.D7 => shift ? '\'' : '7',
(int)Keys.D8 => shift ? '(' : '8',
(int)Keys.D9 => shift ? ')' : '9',
>= (int)Keys.A and <= (int)Keys.Z => shift ? (char)KeyCode : (char)(KeyCode + 0x20),
_ => char.ConvertFromUtf32(KeyCode)[0]
};