#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;};
SetWindowsHookEx (хук не срабатывает)
Устанавливается хук вроде нормально, без ошибок,
но хук-функция почему то не срабатывает.
Вот исходник dll-ки:
Код:
Код:
#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
#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
Цитата:
попробуй так должно сработать
А вот это тоже не помогло. Но я всё таки нашёл ошибку,
почитав внимательней 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();
}
#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);
}
#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);
}