首页 > 解决方案 > 挂钩 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

标签: c++apihook

解决方案


我不熟悉 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) {...}

推荐阅读