Winapi 钩住Windows大小调整事件:未调用钩子

Winapi 钩住Windows大小调整事件:未调用钩子,winapi,hook,Winapi,Hook,我正在尝试与Windows的大小调整事件挂钩。我写了下面的钩子: __declspec(dllexport) LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam) { MSG *msg = (MSG *)lParam; wchar_t text[1014]; GetWindowText(msg->hwnd, text, 1024); if (wcscmp(text,

我正在尝试与Windows的大小调整事件挂钩。我写了下面的钩子:

__declspec(dllexport)
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
    MSG *msg = (MSG *)lParam;

    wchar_t text[1014];
    GetWindowText(msg->hwnd, text, 1024);

    if (wcscmp(text, L"Untitled - Notepad") == 0)
    {
        if (nCode == HCBT_MOVESIZE)
        {
            FILE *file;
            fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
            fprintf(file, "Move or size.\n");
            fclose(file);
        }
        else
        {
            FILE *file;
            fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
            fprintf(file, "Something else.\n");
            fclose(file);
        }
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
我正尝试使用以下方法安装它:

HHOOK hhk = SetWindowsHookEx(WH_CBT, hookProc, hModule, 0);
DWORD err = GetLastError();
同样的技术也适用于其他类型的钩子,但fot WHU CBT不起作用。所有涉及的变量(hookProchModuleadhhk,以及err为0)都具有合理的值,并且没有错误迹象。日志文件中没有显示任何内容

工作版本

我注意到nCode的使用取决于钩子的类型,但我完全忘了检查其他参数;正如Hans所注意到的,lParam对于WH_CBTnCode==HCBT_MOVESIZE,并不指向MSG;相反,lParam指向新的RECT,可以从wParam检索HWND

__declspec(dllexport)
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HCBT_MOVESIZE)
    {
        wchar_t text[1014];
        GetWindowText((HWND)wParam, text, 1024);

        if (wcscmp(text, L"Untitled - Notepad") == 0)
        {
            RECT *rect = (RECT *)lParam;

            FILE *file;
            fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
            fprintf(file, "Move or size (%d, %d, %d, %d) for target window.\n", rect->left, rect->right, rect->top, rect->bottom);
            fclose(file);
        }
        else
        {
            FILE *file;
            fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
            fprintf(file, "Move or size for some other window.\n");
            fclose(file);
        }
    }
    else
    {
        FILE *file;
        fopen_s(&file, "C:\\Users\\Me\\hooklog.txt", "a+");
        fprintf(file, "Something else.\n");
        fclose(file);
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

您认为传递的LPRAM是指向MSG的指针的假设是错误的。检查回调,滚动至底部。您将看到,当nCode==HCBT_MOVESIZE时,lParam是指向RECT的指针

wParam
为您提供窗口句柄


编写防御代码时,千万不要忽略winapi函数返回值。

您认为传递的LPRAM是指向MSG的指针的假设是错误的。检查回调,滚动至底部。您将看到,当nCode==HCBT_MOVESIZE时,lParam是指向RECT的指针

wParam
为您提供窗口句柄


编写防御代码时,千万不要忽略winapi函数返回值。

您认为传递的LPRAM是指向MSG的指针的假设是错误的。检查回调,滚动至底部。您将看到,当nCode==HCBT_MOVESIZE时,lParam是指向RECT的指针

wParam
为您提供窗口句柄


编写防御代码时,千万不要忽略winapi函数返回值。

您认为传递的LPRAM是指向MSG的指针的假设是错误的。检查回调,滚动至底部。您将看到,当nCode==HCBT_MOVESIZE时,lParam是指向RECT的指针

wParam
为您提供窗口句柄


编写防御性代码时,千万不要忽略winapi函数返回值。

安装全局钩子只监视一个窗口太过分了。使用一个可访问性钩子过滤到拥有你关心的窗口的线程。这将是非常有用的,我想知道是否有更具选择性的方法,谢谢!为了确保我明白,你是在说SetWinEventHook和WineVenthook吗?我在文档中看到过这些,但不确定它们是否适合我的情况。@damix911是的,“可访问性钩子过滤到线程”意味着setwineventhook安装全局钩子只监视一个窗口是过分的。使用一个可访问性钩子过滤到拥有你关心的窗口的线程。这将是非常有用的,我想知道是否有更具选择性的方法,谢谢!为了确保我明白,你是在说SetWinEventHook和WineVenthook吗?我在文档中看到过这些,但不确定它们是否适合我的情况。@damix911是的,“可访问性钩子过滤到线程”意味着setwineventhook安装全局钩子只监视一个窗口是过分的。使用一个可访问性钩子过滤到拥有你关心的窗口的线程。这将是非常有用的,我想知道是否有更具选择性的方法,谢谢!为了确保我明白,你是在说SetWinEventHook和WineVenthook吗?我在文档中看到过这些,但不确定它们是否适合我的情况。@damix911是的,“可访问性钩子过滤到线程”意味着setwineventhook安装全局钩子只监视一个窗口是过分的。使用一个可访问性钩子过滤到拥有你关心的窗口的线程。这将是非常有用的,我想知道是否有更具选择性的方法,谢谢!为了确保我明白,你是在说SetWinEventHook和WineVenthook吗?我在文档中看到过这些,但不确定它们是否适合我的情况。@damix911是的,“过滤到线程的可访问性钩子”意味着SetWinEventhook谢谢,我首先为WH_GETMESSAGE编写了一个功能钩子,当我切换到WH_CBT时,我完全没有检查参数语义。谢谢,我第一次为WH_GETMESSAGE编写了一个函数钩子,当我切换到WH_CBT时,我完全没有检查参数语义。谢谢,我第一次为WH_GETMESSAGE编写了一个函数钩子,当我切换到WH_CBT时,我完全没有检查参数语义。谢谢,我首先为WH_GETMESSAGE编写了一个功能性钩子,当我切换到WH_CBT时,我完全无法检查参数语义。