//使用动态链接库 //1.定义一个参数一致的指针形式的函数 typedef int(*lpFun)(int, int); //定义类型 函数指针 lpFun addFun; //函数指针 //2.声明一个句柄,用来加载动态链接库 //注意这是HINSTANCE! HINSTANCE hDll = LoadLibrary("..\\Debug\\libtest.dll"); if (hDll != NULL) { //排除错误 //3.从句柄获得函数地址,并赋值给函数指针 //注意,需要强制转换类型 addFun = (lpFun)GetProcAddress(hDll, "add"); if (addFun != NULL) {//排除错误 //4.使用函数指针 int result = addFun(2, 3); printf("%d", result); } //5.释放动态链接库 FreeLibrary(hDll); } return 0; } //编写简单动态链接库.... //1.声明导出函数 extern "C" int __declspec(dllexport)add(int x, int y); //函数实体 int add(int x, int y) { return (x + y); } //用动态链接库编写全局钩子 //定义钩子函数的句柄(非共享) HHOOK g_hKeyboard=NULL; HHOOK g_hMouse=NULL; #pragma data_seg("MySec") //声明数据段 HWND g_hWndCaller=NULL; //声明共享的调用者句柄 #pragma data_seg() //数据段结束 #pragma comment(linker,"/section:MySec,RWS") //指定该数据段作为 读写共享 //导出函数 extern "C" _declspec(dllexport) extern "C" _declspec(dllexport) void SetHook(HWND hwnd) //传递调用者句柄给它? { //dll为每个调用它的程序保存一份全局变量 g_hWndCaller=hwnd; g_hMouse=SetWindowsHookEx( WH_MOUSE_LL,//消息 低级鼠标消息 MouseProc,//回调函数(便宜地址) GetModuleHandle("HookKey.dll"),//如果函数调用成功,返回值是某一模块的句柄 0 //未知 ); g_hKeyboard=SetWindowsHookEx( WH_KEYBOARD_LL,//低级键盘消息? KeyboardProcLL, //回调函数入口 // GetModuleHandle("HookKey.dll"),//这函数以及这参数还不太懂 GetModuleHandle("showpos.exe"),//这样也可以? 0 //? ); } //增加导出声明 extern "C" _declspec(dllexport) extern "C" _declspec(dllexport) void UnSetHook(HWND hwnd) //传递调用者句柄给它? { g_hWndCaller = hwnd; UnhookWindowsHookEx(g_hKeyboard); UnhookWindowsHookEx(g_hMouse); } //回调钩子函数 LRESULT CALLBACK KeyboardProcLL( int code, // hook code WPARAM wParam, // virtual-key code LPARAM lParam // keystroke-message information ) { KBDLLHOOKSTRUCT *hs = (KBDLLHOOKSTRUCT *)lParam; if(VK_LWIN == hs->vkCode || VK_RWIN == hs->vkCode ) //屏蔽WIN键 { return TRUE; } return CallNextHookEx(g_hKeyboard,code,wParam,lParam); } //回调钩子函数 LRESULT CALLBACK MouseProc( int nCode, // hook code WPARAM wParam, // message identifier LPARAM lParam // mouse coordinates ) { if(wParam == WM_MOUSEMOVE) //只处理WM_MOUSEMOVE消息 { MOUSEHOOKSTRUCT *mhookstruct; //鼠标HOOK结构体 mhookstruct = (MOUSEHOOKSTRUCT*)lParam; //将当前鼠标坐标点的x,y坐标作为参数向主程序窗口发送消息 PostMessage(g_hWndCaller,WH_MOUSE,mhookstruct->pt.x,mhookstruct->pt.y); } return CallNextHookEx(g_hKeyboard,nCode,wParam,lParam); }