c++ - 挂钩 SetWindowLongW API
问题描述
这就是我初始化钩子的方式
if (MH_CreateHookApiEx(L"user32", "SetWindowLongW", &MySetWindowLongW, (LPVOID*)&oSetWindowLongW, nullptr) != MH_OK)
{
std::cout << "MHook Fail To Install Hook." << std::endl;
goto exit;
}
if (MH_EnableHook(&SetWindowLongW) != MH_OK)
{
std::cout << "MHook Fail To Enable Hook." << std::endl;
goto exit;
}
typedef LONG(WINAPI* _MySetWindowLongW)(HWND, int, LONG);
_MySetWindowLongW oSetWindowLongW = nullptr;
LONG MySetWindowLongW(
HWND hWnd,
int nIndex,
LONG dwNewLong
)
{
return oSetWindowLongW(hWnd, nIndex, dwNewLong);
}
Hook 工作,但问题是MySetWindowLongW
在 Visual Studio 中第一次执行后,我has triggered a breakpoint.
在函数完成后得到。
我认为是堆栈或呼叫对话。我真的不知道。
但我试过CreateWindowExW
它的工作正常。唯一的问题SetWindowLongW
。
解决方案
我不熟悉 MinHook,但我知道它的作用。以下是一些在黑暗中猜测的镜头:
作为 Detour 函数传递MySetWindowLongW
给 MH_CreateHookEx 而不是&MySetWindowLongW
. 这可能会或可能不会有所作为。那是:
if (MH_CreateHookApiEx(L"user32", "SetWindowLongW", MySetWindowLongW, (LPVOID*)&oSetWindowLongW, nullptr) != MH_OK)
将您的钩子函数声明并定义为 stdcall 以与您要钩子的函数的调用约定保持一致
extern "C" LONG WINAPI MySetWindowLongW(
HWND hWnd,
int nIndex,
LONG dwNewLong) {...}
推荐阅读
- javascript - 查找关键字匹配,但根据 ReGex JS 中的单词接近度忽略
- hiveql - 失败:ClassCastException primitive.WritableConstantStringObjectInspector 无法转换为primitive.BooleanObjectInspector
- c++ - C++ unordered_map::insert 不会编译
- c# - C# NAudio 如何强制/硬编码音频设备(声卡)?
- regex - 可以使用多行正则表达式注释掉Ruby中的代码吗?
- java - AWS Lambdas 中对 JDK 11 的支持是否会带来任何性能改进?特别是关于冷启动?
- aws-lambda - `sam local invoke`错误'NameError:名称'NpipeHTTPAdapter'未定义'
- sql - MS Access 上最后一个事务的 SQL 查询
- html - 使用 flexbox 连续显示 4 个 div
- r - SpatialGrid 对象和 R 中的栅格对象有什么区别?