У меня есть задача прочитать штрих-код со сканера штрих-кода Symbol LS2208.
Сканер настроен по умолчанию, но с префиксом F13 и надстройкой «Enter». Используя это, сканер эмулирует клавиатуру США. Моя клавиатура датская, и язык ОС установлен на датский.
Мне нравится быть независимым от региональных настроек пользователя.
Прямо сейчас я реализую IMessageFilter, используя:
private const int WM_KEYDOWN = 0x100;
private List<Keys> keysSequence = new List<Keys>();
public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;
if (keyCode == Keys.F13)
{
...
return true;
}
if (keyCode == Keys.Enter)
{
...
string barcode = GenerateBarcode(keysSequence);
return true;
}
keysSequence.Add(keyCode);
}
}
Когда получена клавиша Surfix 'Enter', последовательность клавиш используется для создания строки штрих-кода с помощью метода GenerateBarcode
:
public static string GenerateBarcode(Keys[] captureKeysSequence)
{
StringBuilder barcodeBuffer = new StringBuilder();
bool shift = false;
bool altGr = false;
foreach (Keys keyCode in captureKeysSequence)
{
if (keyCode == Keys.Shift || keyCode == Keys.ShiftKey)
{
shift = true;
continue;
}
if (keyCode == (Keys.Control | Keys.Alt))
{
altGr = true;
continue;
}
barcodeBuffer.Append(GetCharsFromKeys(keyCode, shift, altGr));
shift = false;
altGr = false;
}
return barcodeBuffer.ToString();
}
Здесь я работаю с клавишей shift и altGr.
Теперь причина моих проблем - метод GetCharsFromKeys
:
[DllImport("user32.dll")]
public static extern int ToUnicodeEx(uint virtualKeyCode, uint scanCode,
byte[] keyboardState,
[Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)]
StringBuilder receivingBuffer,
int bufferSize, uint flags, IntPtr dwhkl);
public static string GetCharsFromKeys(Keys keys, bool shift, bool altGr)
{
var buf = new StringBuilder(256);
var keyboardState = new byte[256];
if (shift)
keyboardState[(int)Keys.ShiftKey] = 0xff;
if (altGr)
{
keyboardState[(int)Keys.ControlKey] = 0xff;
keyboardState[(int)Keys.Menu] = 0xff;
}
// Because the Symbol LS2208 maps a US keyboard we need to convert the Keys correctly to chars
ToUnicodeEx((uint)keys, 0, keyboardState, buf, buf.Capacity, 0, InputLanguage.FromCulture(new System.Globalization.CultureInfo("en-US")).Handle);
return buf.ToString();
}
Я пытаюсь преобразовать ввод ключей со сканера штрих-кода в строку. И для большинства обычных символов это работает отлично (как строчные, так и верхние символы и цифры), а также некоторые специальные символы, найденные над цифрами на клавиатуре, работают (например, «$»).
Но при тестировании со штрих-кодом типа "12/34 - 56" я получаю вывод "12 - 34 = 56"?
Я думаю, что это как-то связано с отображением между американской и датской клавиатурой, но я не могу понять, почему?
Может ли кто-нибудь помочь мне с этим преобразованием?
GetKeyboardState
, как вы предложили, и использовать вывод в качестве ввода дляToUnicodeEx
. Но все тот же результат, со странным выводом штрих-кода. Можете ли вы привести пример? - person kaarelyngejensen   schedule 27.11.2014