如果我有一个控制台应用程序,其句柄设置如此;
HWND hWnd = GetConsoleWindow();
然后如何为窗口设置新的wndProc?
我尝试使用
SetWindowLong(hWnd, GWL_WNDPROC, (LONG)conProc);
将conProc定义为
LRESULT CALLBACK conProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_NCHITTEST:
return HTCAPTION;
}
return DefWindowProc(hWnd, msg, wParam, lParam );
}
但它不起作用并在GetLastError()
上说“错误代码:5 - 访问被拒绝”
我知道修改这样的控制台应用程序非常困难,因为它是一个csrss.exe应用程序,但我仍然想尝试.. 感谢。
答案 0 :(得分:13)
虽然印象是控制台窗口属于您的进程(与其他窗口一样),但它实际上由CSRSS
系统进程托管,其WndProc就在那里。这使您无法继承窗口并在您的过程中提供自己的WndProc。
一些相关的阅读:
答案 1 :(得分:0)
首先,SetWindowLong被SetWindowLongPtr取代,您应该使用该函数。
您是否尝试更改自己的控制台窗口或其他进程的WNDPROC?
来自MSDN文档:
GWL_WNDPROC
-4
Sets a new address for the window procedure.
You cannot change this attribute if the window does not belong to the same process as the calling thread.