使用 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 项目。
我想在本地挂接我的 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 项目。