Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Делаем Hook клавы не используя dll


Автор: Manve 30.7.2004, 00:52
Привет всем!

Нужно реализовать hook для клавы , однако реализация с dll мне по определенным причинам не подходит. Решения данной проблемы я так, увы, и не нашел (может плохо искал smile.gif ), пришлесь изобретать самому. Вот что у меня получилось.

Для 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();
}


Может кому и пригодится. smile.gif

Автор: Step 30.7.2004, 12:46
Проверю внесу в фак

Автор: Manve 30.7.2004, 13:07
Попутно еще один вопрос: как можно узнать хэндл окна зная лишь часть его имени?

Автор: Step 30.7.2004, 14:00
Manve, поищите в форуме, кто-то писал функцию енумерейтвиндоу..... давно правдо было

Автор: oleg1973 31.7.2004, 17:45
http://forum.vingrad.ru/index.php?showtopic=27143&st=0&unread=#entry192489
мой вариант

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)