hi all,
i have problems running this code (taken from:
http://blogs.msdn.com/michkap/archive/2006/12/20/1332470.aspx) in wine (1.1.26).
the GetKeyState trick is not working, so GetKeyboardState never fills in any
information in windowless apps.
> /*
> * If this thread needs a key state event, give one to it. There
are
> * cases where any app may be looping looking at GetKeyState(),
plus
> * calling PeekMessage(). Key state events don't get created
unless
> * new hardware input comes along. If the app isn't receiving
hardware
> * input, it won't get the new key state. So ResyncKeyState()
will
> * ensure that if the app is looping on GetKeyState(), it'll
get the
> * right key state.
> */
Code:
#include <windows.h>
#include <cstdio>
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM
lParam) {
if(nCode == HC_ACTION && wParam == WM_KEYDOWN) {
KBDLLHOOKSTRUCT* key = (KBDLLHOOKSTRUCT*)lParam;
GetKeyState(0);
BYTE keyState[256];
GetKeyboardState(keyState);
WORD chars;
if(ToAscii(key->vkCode, key->scanCode, keyState, &chars, 0)) {
if((char)chars == '\r') putchar('\n');
else putchar(chars);
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main(int argc, char** argv) {
HHOOK hhk = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc,
GetModuleHandle(NULL), 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0);
UnhookWindowsHookEx(hhk);
return 0;