DLL代码:
myHooke.c
#include "myHooke.h"
#include <windows.h>
#include <winuser.h>
#include <stdlib.h>
#include <stdio.h>
int ndown = 0;
HHOOK hhkHook = NULL; //定义钩子句柄
HINSTANCE hInstance = NULL; //程序实例
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
hInstance = (HINSTANCE)hModule; //得到DLL实例
return TRUE;
}
//回调函数
__declspec(dllexport) LRESULT CALLBACK myHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT Result=CallNextHookEx(hhkHook, nCode, wParam, lParam);
if(wParam == 'M' && (lParam & 0x40000000))
{
printf("M is downed ! %d\n", ndown++);
}
return Result;
}
//加载钩子
int load()
{
if(!(hhkHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)myHookProc, hInstance, 0)))
{
return FALSE;
}
return TRUE;
}
//卸载钩子
int unload()
{
return UnhookWindowsHookEx(hhkHook);
}
myHooke.h:
#ifndef MYHOOKD_H
#define MYHOOKD_H
#define EXPORT __declspec(dllexport)
#define _WIN32_WINNT 0x400
EXPORT int load();
EXPORT int unload();
#endif
调用的函数:
#include <windows.h>
#include <winuser.h>
#include <stdio.h>
#include <stdlib.h>
typedef int (*FUNCTION)();
int main(int argc, char *argv[])
{
HINSTANCE hDll;
FUNCTION loadhook = NULL;
FUNCTION unloadhook = NULL;
hDll = LoadLibrary("..\\myHooke\\Debug\\myHooke.dll");
if(hDll != NULL)
{
loadhook = (FUNCTION)GetProcAddress(hDll, "load");
unloadhook = (FUNCTION)GetProcAddress(hDll, "unload");
if(loadhook == NULL)
{
MessageBox(0, "loadhook failed", "MyHook", MB_OK);
return 1;
}
if(unloadhook == NULL)
{
MessageBox(0, "unloadhook failed", "MyHook", MB_OK);
return 1;
}
if(!loadhook())
{
return 1;
}
// while(1)
{
printf("hook is load !");
MessageBox(0, "Hold on box", "MyHook", MB_OK);
//使用循环会使程序卡住,所以用了MessageBox是程序暂停
Sleep(1000);
}
unloadhook();
FreeLibrary(hDll);
}
return 0;
}
有些出口可以获取键盘消息,有些不能获取键盘消息,这是全局钩子,我是菜鸟,求大神帮助啊!!!
补充一下,程序运行时,切换到其他程序,有的可以获取键盘消息,printf有响应;有的没有任何响应,比如切换到网页等;
我想实现的功能是:无论在哪里,只要键盘按下,我的程序就会有响应 打印按键被按下的消息