Форум С++

 

Ответить на сообщение

Вернуться к теме

Вы отвечаете на сообщение:

Автор: 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;
}


Ваше имя:

Пароль:

Цитировать

Используйте тэги для выделения текста:
Код: [code][/code]
Жирный: [b][/b]
Наклонный: [i][/i]
URL: [url][/url]

Сообщение:

Прикрепить: