关于SetWindowsHook设置一个消息hook
//这是EXE#include <iostream>
#include <windows.h>
typedef BOOL (*stratHOOK)();
typedef BOOL (*freeHOOK)();
int main()
{
HMODULE hload= LoadLibrary("Dll14.dll");
if (hload == NULL)
printf("LoadLibrary_erro=%d\n",GetLastError());
HMODULE hmoudle = GetModuleHandle("Dll14.dll");
stratHOOK mystratHOOK = (stratHOOK)GetProcAddress(hmoudle,"stratHOOK");
freeHOOK myfreeHOOK = (freeHOOK)GetProcAddress(hmoudle, "freeHOOK");
mystratHOOK();
// myfreeHOOK();
system("pause");
return 0;
}
//这是DLL
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <iostream>
#include "mydll.h"
HMODULE g_hModule;
HHOOK __sethook;
//钩子回调函数
LRESULT Hookproc(
intcode,
WPARAM wParam,
LPARAM lParam
);
//安装钩子
BOOL stratHOOK();
//卸载钩子
BOOL freeHOOK();
/////////////////////////////////////////////////////////
//钩子处理函数
LRESULT Hookproc(
intcode,
WPARAM wParam,
LPARAM lParam
)
{
if (code == HC_ACTION)
printf("%c\n", wParam);
else
CallNextHookEx
(NULL,
code,
wParam,
lParam);
return 0;
}
//安装钩子
BOOL stratHOOK()
{
__sethook = SetWindowsHookEx(WH_KEYBOARD,
(HOOKPROC)Hookproc,
g_hModule, 0);//设置全局消息钩子
if (__sethook)
{
printf("HOOK成功\n");
return 1;
}
else
return 0;
}
//卸载钩子
BOOL freeHOOK()
{
UnhookWindowsHookEx(__sethook);
return 0;
}
/////////////////////////////////////////////////////
BOOL APIENTRY DllMain( HMODULE hModule,
DWORDul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
g_hModule = hModule;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
问题是程序运行时候不进入 钩子回调函数LRESULT Hookproc来处理消息,希望大神们指点一二 SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)Hookproc, g_hModule, 0);//设置全局消息钩子
请注意WH_KEYBOARD,这个是键盘钩子,不是全局钩子,所以对应的回调函数不能用HC_ACTION
程序写的不对应的。
sky27076 发表于 2024-1-29 08:43
SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)Hookproc, g_hModule, 0);//设置全局消息钩子
请注意WH ...
setwindowshookex 这个函数能跨进程给另一个进程设置消息钩子吗?还是只能将这个函数封装进一个DLL然后将DLL注入到另一个进程中来来实现对其他进程的操作呢????我个人觉得不能,因为能跨进程操作的API都有一个内核对象,这个函数的参数没有安全描述符
sky27076 发表于 2024-1-29 08:43
SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)Hookproc, g_hModule, 0);//设置全局消息钩子
请注意WH ...
全局钩子与非全局钩子取决于setwindowshook这个函数的最后一个参数,最后的参数ThreadID为0则为全局钩子,如果指定了线程ID那么就不是全局钩子
页:
[1]