Автор: N0mad (23.09.2009 в 13:16)
Нашёл в чем дело. Проблема была в функции GetKeyboardState().
Замечания к функии
Прикладная программа может вызвать эту функцию, чтобы извлечь данные о текущем состоянии всех виртуальных клавиш. Состояние изменяется тогда, когда поток удаляет сообщения клавиатуры из ее очереди сообщений. Состояние не изменяется тогда, когда сообщения клавиатуры посланы в очередь сообщений.
Видимо поток не успевал удалять сообщение из очереди.
Решил это так
void ProcessMessage()
{
MSG msg;
while (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
return;
}
}
WORD GetSymbolFromVK(WPARAM wParam, UINT scanecode)
{
BYTE btKeyState[256];
HKL hklLayout = GetKeyboardLayout(0);
TCHAR Symbol = NULL;
//LoadKeyboardLayout(TEXT("00000409"), KLF_ACTIVATE);
ProcessMessage();
GetKeyboardState(btKeyState);
if ((ToUnicodeEx(wParam, scanecode, btKeyState, &Symbol, 1, 0, hklLayout) == 1) && // сам перевод
(GetKeyState(VK_CONTROL) >= 0) && (GetKeyState(VK_MENU) >= 0))
{
return Symbol;
}
return -1;
}