使用 SetWindowLong 挂钩本地 WndCallback:ACCESS DENIED

Hooking local WndCallback using SetWindowLong: ACCESS DENIED

我想在本地挂接我的 WindowProc 函数。首先,我想到了 SetWindowsHookEx,但我不希望只有这个挂钩有一个外部 DLL。我想在内部和本地进行(我不想要全局挂钩)。 这就是我遇到 SetWindowsLong 的原因。我正在尝试使用 GWL_WNDPROC 选项更改 WindowProc,但我总是收到错误消息:拒绝访问,我不知道为什么。这是我非常简单的例子,遗憾的是它不起作用:

#include <windows.h>
#include <stdio.h>

WNDPROC pOrigProc;

LRESULT CALLBACK HookWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    printf("Message arrived!\n");
    return CallWindowProc(pOrigProc, hwnd, uMsg, wParam, lParam);
}

int main()
{
    HWND handle = FindWindow("ConsoleWindowClass", 0);
    if(!handle)
    {
        printf("HWND get error!\n");
    }
    else
    {
        DWORD dwProcId;
        GetWindowThreadProcessId(handle, &dwProcId);
        if( dwProcId != GetCurrentProcessId())
        {
            printf("Corrupted Handle!\n");
        }
        else
        {
            printf("Window handle belongs to my process!\n");
        }
    }

    pOrigProc = (WNDPROC)SetWindowLong(handle, GWL_WNDPROC, (LONG)HookWndProc);
    if(!pOrigProc)
    {
        printf("SWL Error: %d\n", GetLastError());
    }
    else
    {
        printf("Successfully hooked the Window Callback!\n");
    }

    MSG message;    // Let's start imitating the prescence of a Win32GUI
    while (GetMessage(&message, NULL, 0, 0))
    {
        TranslateMessage(&message);
        DispatchMessage(&message);
    }
}

当然,FindWindow 不会成为我的主要项目中的最佳解决方案,但我认为在这个小示例中它已经足够好了。如您所见,我正在确保找到的 HWND 是我自己的,所以这应该不是问题所在。 在我的例子中,它返回 "Window handle belongs to my process!" 和 SWL Error: 5
错误 5 是(根据 msdn)访问被拒绝。

我希望有人能看到我找不到的可能的小愚蠢错误。谢谢!

MSDN 说 "You cannot change this attribute if the window does not belong to the same process as the calling thread"。从您的示例中可以看出您的应用程序是控制台,而不是 GUI。可能 ConsoleWindowClass 不是由您的应用程序定义的,而是由 Windows 全局定义的。尝试类似但使用 GUI 项目。