hook
#include <vcl.h> //原有BCB 头文件 #include <windows.h> //原有window 头文件 #pragma hdrstop #pragma argsused const int WM_KEYHOOK = WM_USER+100; HHOOK hHook; HWND hAppWnd; HINSTANCE inst; extern "C" { __declspec(dllexport) __stdcall void SetHook(void); __declspec(dllexport) __stdcall void RemoveHook(void); } LRESULT CALLBACK KeyboardProc(int, WPARAM, LPARAM); int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { inst = hinst; switch (reason) { case DLL_PROCESS_ATTACH : hAppWnd = ::FindWindow("TKeyHookForm", 0); break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return 1; } void __stdcall SetHook(void) { if(hHook == NULL) { hHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, inst, 0); if(hHook == NULL) MessageBox(NULL, "Sorry! 无法挂上Hook。", "Hook DLL", MB_OK); else ::TextOut(GetDC(0),10,10,"挂上Hook。",10); } } void __stdcall RemoveHook(void) { if(hHook != NULL) { if(::UnhookWindowsHookEx(hHook) != FALSE) { hHook = NULL; ::TextOut(GetDC(0),50,10,"释放Hook。",10); } else MessageBox(NULL, "Sorry! 无法释放Hook。", "Hook DLL", MB_OK); } else ::TextOut(GetDC(0),80,10,"Hook isn't NULL",16); } LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if((nCode < 0) || nCode == HC_NOREMOVE) return ::CallNextHookEx(hHook, nCode, wParam, lParam); if(lParam & 0x40000000) return ::CallNextHookEx(hHook, nCode, wParam, lParam); if(hAppWnd != NULL) SendMessage(hAppWnd, WM_KEYHOOK, wParam, lParam); return ::CallNextHookEx(hHook, nCode, wParam, lParam); }
原文地址:https://www.cnblogs.com/xe2011/p/594b34939916e070aad2e1e4d2ae8d04.html