Я использую глобальный клавиатурный крючок для работы со считывателем штрих-кода. Считыватель штрих-кода отправляет символ STX перед штрих-кодом и символ ETX после штрих-кода.GetKeyboardState и ToAscii не всегда правильно обрабатывают символы STX и ETX.
Иногда функция ToAscii приводит к соответствующим кодам STX и ETX (0x02 или 0x03), но большую часть времени она становится 0x62 (b) или 0x63 (c).
Можно ли это объяснить и разрешить?
Я добавил крючок обратного вызова для ясности ниже:
private IntPtr HookCallback(int nCode, IntPtr wParam, ref KBDLLHOOKSTRUCT lParam)
{
if (nCode >= 0)
{
// Prepare the characters and retrieve the keyboard state.
char[] characters = new char[2];
byte[] keyState = GetKeyboardState();
if (KeyPressed != null && WinAPI.ToAscii(lParam.vkCode, lParam.scanCode, keyState, characters, 0) == 1)
{
// Initialize the event arguments and fire the KeyPressed event.
GlobalKeyboardHookEventArgs e = new GlobalKeyboardHookEventArgs(characters, (int)wParam);
KeyPressed(null, e);
// Do not call the next hook if the event has been handled.
if (e.Handled)
{
return (IntPtr)1;
}
}
}
// Call the next hook.
return WinAPI.CallNextHookEx(hook, nCode, wParam, ref lParam);
}
}
Есть много причин думать ... Пожалуйста, разместите код, чтобы мы могли понять суть контекста. – lboshuizen
Я добавил код обратного вызова. – saracaen
STX и ETX - это общие управляющие коды, используемые при передаче по последовательному порту. Они не имеют смысла для клавиатуры, и вы никогда не должны передавать их ToAscii(). –