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

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

最佳答案

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

一些相关阅读:

关于C++:如何为控制台应用程序设置新的 wndProc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13371644/

相关文章:

windows - 没有 Windows 窗体的 AddMessageFilter?

c++ - 如何正确显示不同语言的字符?

java - Eclipse RCP 消息控制台 : How to allow user to input and handle this listener?

c++ - 为什么并行 for_each 需要前向迭代器?

c++ - 在 CUDA 内核中使用许多固定大小的矩阵

c++ - 事件驱动编程——事件循环?

c++ - avr-gcc 上的自动释放

c++ - winapi 函数的函数指针 (stdcall/cdecl)

c++ - 如何在 Visual Studio 2017 中创建 Visual C++ MFC 控制台项目

string - 使用 PowerShell sls (Select-String) vs grep vs findstr