dll 部分:
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include <windows.h>
#include <iostream>
HHOOK g_hHook = nullptr;
HINSTANCE g_hInstance=nullptr;
LRESULT CALLBACK MsgHookProc(
_In_ int code,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{
if (HC_ACTION == code)
{
PMSG pMsg = (PMSG)lParam;
if (WM_CHAR == pMsg->message)
{
// make sure key down
// which key key down
char szKey = (char)pMsg->wParam;
char szWindowName[MAXBYTE] = { 0 };
char szDebug[MAXBYTE] = { 0 };
GetWindowTextA(pMsg->hwnd, szWindowName, MAXBYTE);
sprintf_s(szDebug, MAXBYTE, "window Name: %s received a message :%c \n", szWindowName, szKey);
OutputDebugStringA(szDebug);
}
}
// returen call
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
extern "C"
_declspec(dllexport) BOOL StartHook()
{
bool bRet = false;
do
{
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, MsgHookProc, g_hInstance, NULL);
// tools->Error Finding
if (nullptr == g_hHook)
{
DWORD dwError = GetLastError();
SetLastError(dwError);
break;
}
bRet = true;
} while (false);
return bRet;
}
bool UnHook()
{
if (g_hHook)
{
return UnhookWindowsHookEx(g_hHook);
}
return false;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:// when dll loaded by process
g_hInstance = hModule;
break;
case DLL_THREAD_ATTACH:// when dll loaded by thread
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
UnHook();
break;
}
return TRUE;
}
调用部分:
// SetWindowsHookExDemo.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Windows.h"
#include <iostream>
using namespace std;
LRESULT CALLBACK MsgHookProc(
_In_ int code,
_In_ WPARAM wParam,
_In_ LPARAM lParam
);
HHOOK g_hHook = nullptr;
typedef BOOL(*Func)();
int main(int argc,char* argv[])
{
// you must implement this function in dll
// because dll is global shared
//g_hHook = SetWindowsHookEx(WH_GETMESSAGE,MsgHookProc,nullptr,NULL);
tools->Error Finding
//if (nullptr == g_hHook)
// DWORD dwError = GetLastError();
DWORD dwError = NOERROR;
HINSTANCE hDll = nullptr;
bool bRet = false;
do
{
hDll = LoadLibraryW(L"SetWindowsHookExDll.dll");
if (!hDll)
{
dwError = GetLastError();
break;
}
Func fun = (Func)GetProcAddress(hDll, "StartHook");
if (!fun)
{
dwError = GetLastError();
break;
}
if (!fun())
break;
while (true)
{
char szInput[MAXBYTE] = { 0 };
cin >> szInput;
if (0 == strcmp(szInput, "yes"))
{
break;
}
}
bRet = true;
} while (false);
if (false==bRet)
{
cout << "Error: " <<dwError<< endl;
}
if (hDll)
{
FreeLibrary(hDll);
}
system("pause");
/*UnhookWindowsHookEx(g_hHook);*/
return 0;
}