C ++:如何为控制台应用程序设置新的wndProc?

时间:2012-11-14 01:11:04

标签: c++ winapi console access-denied wndproc

如果我有一个控制台应用程序,其句柄设置如此;

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应用程序,但我仍然想尝试.. 感谢。

2 个答案:

答案 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.