Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

SetWindowsHookEx (хук не срабатывает)

41K
28 октября 2010 года
kisssko
108 / / 28.10.2010
Собственно, вынес хук в dll-ку, как и положено.
Устанавливается хук вроде нормально, без ошибок,
но хук-функция почему то не срабатывает.
Вот исходник dll-ки:

Код:
#include <stdio.h>
#include <windows.h>

#define DLL_EXPORT __declspec(dllexport)

int counter=0;

DLL_EXPORT LRESULT WINAPI llkbdproc(int nCode, WPARAM wParam, LPARAM lParam)
 {
//  printf("Code: %d, wParam: %d lParam: %d \n", nCode, wParam, lParam);
  counter++;
  CallNextHookEx(NULL, nCode, wParam, lParam);
  return 0;
 }

DLL_EXPORT int get_counter() {return counter;};
27K
28 октября 2010 года
TDK
29 / / 30.09.2008
попробуй так должно сработать
Код:
#include <windows.h>

#ifdef __cplusplus
extern "C" {
#endif

HHOOK hHKeyBrd = NULL;

LRESULT CALLBACK KeyBrdProc(int nCode, WPARAM wParam, LPARAM lParam)
{
 if  (nCode == HC_ACTION)
    {
...
    }
 return CallNextHookEx (hHKeyBrd,nCode,wParam,lParam);
}

__declspec(dllexport) bool SetHooks(HINSTANCE hModule)
{

    hHKeyBrd = SetWindowsHookEx(WH_KEYBOARD, KeyBrdProc, (HINSTANCE) hModule, NULL);
    return true;
}

__declspec(dllexport) bool UnHook()
{
    return true;
}

#ifdef __cplusplus
}
#endif
41K
29 октября 2010 года
kisssko
108 / / 28.10.2010
Цитата:
попробуй так должно сработать



А вот это тоже не помогло. Но я всё таки нашёл ошибку,
почитав внимательней MSDN.
Вызывающее приложение должно висеть в <GetMessage loop>,
а не в Sleep, как у меня было.

Если кому интересно -- вот работающий код.
Приложение:

Код:
#include <stdio.h>
#include <windows.h>

typedef BOOL      (*UnHookProc) (void);
typedef HINSTANCE (*SetHookProc)(HINSTANCE);

MSG   msg;
HHOOK hk=NULL;
DWORD erc;
BOOL  bRes;

SetHookProc SetHook;
UnHookProc  UnHook;
HINSTANCE   hDLL;

int main(int argc, char **argv)
{

hDLL=LoadLibrary("kbdhook.dll");
SetHook=(SetHookProc)GetProcAddress(hDLL, "SetHook");
UnHook =( UnHookProc)GetProcAddress(hDLL,  "UnHook");

if(SetHook==NULL)
 {
  erc=GetLastError();
  printf("Error (code: %d) \n", (int)erc);
  return 1;
 }

if(UnHook==NULL)
 {
  erc=GetLastError();
  printf("Error (code: %d) \n", (int)erc);
  return 1;
 }

SetHook(hDLL);

while(bRes=GetMessage(&msg,0,0,0))
 {
  printf("MSG:%X, WParam:%X, LParam:%X \n",
         (int)(msg.message&65535), msg.wParam, msg.lParam);
 }

UnHook();

}


DLL:
Код:
#include <windows.h>

#define DLL_EXPORT __declspec(dllexport)

HHOOK hHKbd=NULL;
KBDLLHOOKSTRUCT* kbdata;

LRESULT CALLBACK KbdProc(int nCode, WPARAM wParam, LPARAM lParam)
 {
  kbdata = (KBDLLHOOKSTRUCT*)lParam;
  printf("Message: %X, Virtual Code: %u, Scan Code: %u \n",
          wParam, kbdata->vkCode, kbdata->scanCode);
  return CallNextHookEx(hHKbd,nCode,wParam,lParam);
 }

DLL_EXPORT HHOOK SetHook(HINSTANCE hModule)
 {
  return (hHKbd = SetWindowsHookEx(WH_KEYBOARD_LL, KbdProc, hModule, 0));
 }

DLL_EXPORT BOOL UnHook(void)
 {
  return UnhookWindowsHookEx(hHKbd);
 }
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог