Я использую следующий код для получения строки Unicode состояния клавиатуры:
std::wstring App::DecodeMessage(KBDLLHOOKSTRUCT* kbHook) {
// Clean up the keyboard state
for(int i=0; i<256; ++i) keyboardMap[i] = 0;
// Get the state of all the virtual keys
GetKeyboardState(keyboardMap);
// Then we get the current layout setting
HKL kbdLayout = GetKeyboardLayout(0);
// We create the buffer to receive the unicode chars
std::vector<wchar_t> buffer;
buffer.resize(257);
buffer.assign(257, L'\0');
// And finally we translate all this to an unicode char
int numberOfChars = ToUnicode(kbHook->vkCode, kbHook->scanCode, keyboardMap, &buffer[0], 256, 0);
if(numberOfChars >= -1 && numberOfChars <= 0) return std::wstring(L"");
return std::wstring(&buffer[0], numberOfChars);
}
Моя раскладка клавиатуры US-INTL, и без запуска приложения, когда я нажимаю «‘» (простая кавычка) и при втором нажатии клавиши я нажимаю «а», я получаю á. Однако, с помощью этой функции, когда я нажимаю «» (снова простую кавычку), я фактически получаю ДРУГУЮ одинарную кавычку в любом приложении, на которое я нацелена. Кроме того, кажется, что это не дает правильную кодировку, поскольку она не будет записывать. Я не знаю, кто-нибудь может помочь?
Так что я наконец разобрался, чтобы не использовать ToUnicode. В итоге я использовал решение, созданное Марком-Андре Моро, которое можно найти на http://keymagic.googlecode.com/svn-history/r112/trunk/KeyMagicDll/kbdext.cpp, если кому-то интересно.
Других решений пока нет …