工場向けの案件でキーボード入力タイプ(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] };