如果我有一个控制台应用程序,它的句柄是这样设置的;
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 应用程序,但我仍然想尝试.. 谢谢。
最佳答案
虽然给人的印象是控制台窗口属于您的进程(与其他窗口一样),但实际上它由 CSRSS
系统进程托管,并且它的 WndProc 就在那里。这使您无法子类化窗口并提供您自己的 WndProc 生活在您的进程中。
一些相关阅读:
关于C++:如何为控制台应用程序设置新的 wndProc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13371644/