版权声明:转载请声明出处,谢谢~ https://blog.csdn.net/what951006/article/details/79769317
帮一个朋友写的这个小东西,要生成dll,有点小奇怪是要给java端来调用,主要就是个勾子来把消息截获了,就后程序程序就收不到了。关于这种勾子处理网上资料多的很。
生成hook 的dll代码
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"
HHOOK g_HookHwnd = NULL;
// 钩子子程
LRESULT CALLBACK MyHookFun(int nCode, WPARAM wParam, LPARAM lParam)
{
// 这个Structure包含了键盘的信息
/*typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;*/
// 我们只需要那个vkCode
PKBDLLHOOKSTRUCT pVirKey = (PKBDLLHOOKSTRUCT)lParam;
// MSDN说了,nCode < 0的时候别处理
if (nCode >= 0)
{
// 按键消息
switch (wParam)
{
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
switch (pVirKey->vkCode)
{
case VK_LWIN:
case VK_RWIN:
return 1; // 吃掉消息
break;
}
return 1;
break;
}
}
return CallNextHookEx(g_HookHwnd, nCode, wParam, lParam);
}
HMODULE g_Module;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
{
break;
}
}
return TRUE;
}
extern "C" _declspec(dllexport) void FuncHookKey()
{
if (!g_HookHwnd)
{
g_HookHwnd = SetWindowsHookEx(WH_KEYBOARD_LL, MyHookFun, g_Module, 0);
}
}
extern "C" _declspec(dllexport) void FuncEndHook()
{
UnhookWindowsHookEx(g_HookHwnd);
g_HookHwnd = NULL;
}
然后就是来调用它了
typedef void (*FUNC_START)(); //FuncHookKey
typedef void (*FUNC_END)(); //FuncEndHook
HMODULE g_Dll;
FUNC_START func_start;
FUNC_END func_end;
g_Dll = LoadLibrary(L"Hook.dll");
func_start = (FUNC_START)GetProcAddress(g_Dll, "FuncHookKey");
func_end = (FUNC_END)GetProcAddress(g_Dll, "FuncEndHook");
//期间一直GetProAddress为空,吗的,注意生成dll的各种小细节,好了现在就可以拿着地址到处乱玩了~~
更多文章:https://blog.csdn.net/what951006
powered by:小乌龟在大乌龟背上~