挂钩到Windows大小调整事件:不调用hook

时间:2013-10-23 13:08:47

标签: 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, 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();

相同的技术适用于其他类型的钩子,但是WH_CBT不起作用。调用后所有变量( hookProc hModule 广告 hhk 错误 0 )具有合理的值,并且没有错误的迹象。在日志文件中没有显示任何内容。

工作版

我注意到nCode的使用取决于钩子的类型,但我完全忘记检查其他参数;正如Hans注意到 lParam 没有指向 WHGC MSG nCode == HCBT_MOVESIZE ;相反, lParam 指向新的 RECT HWND 可以从 wParam 中检索。

__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);
}

1 个答案:

答案 0 :(得分:3)

您认为传递的lParam是指向MSG的指针是错误的。检查MSDN article是否有回调,滚动到底部。你会看到当nCode == HCBT_MOVESIZE时,lParam是一个指向RECT的指针。

wParam为您提供了窗口的句柄。

防守代码,永远不要忽略winapi函数返回值。