11

如果我有一个带有句柄的控制台应用程序,像这样设置;

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 );
}

但它不起作用并显示“错误代码:5 - 访问被拒绝”GetLastError()

我知道像这样修改控制台应用程序非常困难,因为它是一个 csrss.exe 应用程序等等,但我仍然想尝试.. 谢谢。

4

2 回答 2

16

虽然给人的印象是控制台窗口属于您的进程(就像其他窗口一样),但它实际上是由CSRSS系统进程托管的,并且它的 WndProc 就在那里。这使您无法对窗口进行子类化并在您的进程中提供您自己的 WndProc。

一些相关阅读:

于 2012-11-18T09:27:00.043 回答
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.

于 2012-11-14T01:34:18.583 回答