MessageHook.dll的h文件:
#pragma once
extern "C" _declspec(dllexport) bool OnHook();
extern "C" _declspec(dllexport) bool OffHook();
MessageHook.dll的cpp文件:
#include "stdafx.h"
#include "MessageHook.h"
#include <stdio.h>
#include <stdlib.h>
extern HMODULE g_hModule;
HHOOK g_Hook = 0;
LRESULT CALLBACK MyKeyBoard(_In_ int code, _In_ WPARAM wParam, _In_ LPARAM lParam)
{
// 判断是否wParam与lParam都有键盘消息,是的话则执行打印操作
if (code == HC_ACTION){
// 将256个虚拟键的状态拷贝到指定的缓冲区中,如果成功则继续
BYTE KeyState[256] = { 0 };
if (GetKeyboardState(KeyState)) {
// 得到第16–23位,键盘虚拟码
LONG KeyInfo = lParam;
UINT keyCode = (KeyInfo >> 16) & 0x00ff;
WCHAR wKeyCode = 0;
ToAscii((UINT)wParam, keyCode, KeyState, (LPWORD)&wKeyCode, 0);
// 将其打印出来
WCHAR szInfo[512] = { 0 };
swprintf_s(szInfo, _countof(szInfo), L"Hook%c", (char)wKeyCode);
OutputDebugString(szInfo);
return 0;
}
}
return CallNextHookEx(g_Hook, code, wParam, lParam);
}
//开启消息钩子,拦截键盘消息
bool OnHook()
{
g_Hook = SetWindowsHookEx(WH_KEYBOARD, MyKeyBoard, g_hModule, 0);
if (g_Hook == NULL)
{
return false;
}
return true;
}
//关闭消息钩子
bool OffHook()
{
if (g_Hook != NULL)
{
UnhookWindowsHookEx(g_Hook);
return true;
}
return false;
}
dllmain的cpp文件:
#include "stdafx.h"
HMODULE g_hModule = 0;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = hModule;
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
调用cpp文件:
#include "stdafx.h"
#include <process.h>
#include "..\MessageHook\MessageHook.h"
#pragma comment(lib,"..\\debug\\MessageHook.lib")
int _tmain(int argc, _TCHAR* argv[])
{
OnHook();
system("pause");
OffHook();
return 0;
}
消息钩子注入示例
最新推荐文章于 2023-10-06 21:05:45 发布