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

C++: How to set a new wndProc for a console application?

本文关键字:设置 wndProc 应用程序 控制台 C++      更新时间:2023-10-16

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

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。

一些相关阅读:

  • 负责显示显示控制台的 GUI 窗口的过程是......中国证券交易委员会
  • 带有WH_KEYBOARD的 SetWindowsHookEx 对我不起作用,我错了什么?
  • 子类化 XP 控制台窗口
首先,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.