首先必须准备一个dl
ForHook.cpp 内容如下
// ForHook.cpp : 定义 DLL 应用程序的入口点。 // #define _WIN32_WINNT 0x4000 #include <Windows.h> #include <stdio.h> BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; } // // 这个函数的目的: // 这个函数放在dll中,当dll被加载时(SetWindowsHookEx可以做到让所有线程加载) // 可以让这个函数地址被 加载了这个dll的线程访问 LRESULT HookProc(int code, WPARAM wParam, LPARAM lParam) { //MessageBox(NULL,"hello","",0); // 可能导致pc死机 { //test KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam; if (VK_F4==pStruct->vkCode) { FILE *fp; fp = fopen("1.txt","w"); if (NULL!=fp) { fwrite("hello",6,1,fp); fclose(fp); } } } return CallNextHookEx(NULL,code,wParam,lParam); }
ForHook.def 内容如下
LIBRARY ForHook EXPORTS HookProc @1
生成dll
然后测试 :
在stdafx.h中 #pragma once之后添加
#pragma once #define _WIN32_WINNT 0x0400
在WndProc函数中添加
case WM_CREATE: { hModule = LoadLibrary("ForHook.dll"); HOOKPROC HookProc = (HOOKPROC)GetProcAddress(hModule,"HookProc"); hhook =SetWindowsHookEx(WH_KEYBOARD_LL,HookProc,hModule,0); // } break;
case WM_DESTROY: { UnhookWindowsHookEx(hhook); FreeLibrary(hModule); } PostQuitMessage(0); break;
以前必须把 SetWindowsHookEx 放在dll里边(考虑到CallNextHookEx的第一个参数)
但当很多老人再看看msdn,结果发现
hhk [in, optional]
Type: HHOOK
This parameter is ignored.
~~
所以这个不是必要的。