【问题标题】:Trying Subclassing on Console在控制台上尝试子类化
【发布时间】:2013-02-09 12:25:58
【问题描述】:

我想在控制台应用程序中捕获键盘消息,所以我尝试了这个:

HWND GetConsoleHwnd(void)
{
    #define SIZEBUF 1024
    char szBuffer[SIZEBUF];

    GetConsoleTitle(szBuffer, SIZEBUF);

    #undef SIZEBUF
    return FindWindow(NULL, szBuffer);
}

LRESULT CALLBACK ConsoleProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch (msg)
    {
        case WM_KEYDOWN:
            switch (wParam)
            {
               //VK Cases
            }
            break;
    }

    return CallWindowProc(OldConsoleProc, hwnd, msg, wParam, lParam);
}

这在主要的:

HWND hwndConsole = GetConsoleHwnd();
OldConsoleProc = (WNDPROC) SetWindowLong(hwndConsole, GWL_WNDPROC,
                               ConsoleProc);

还有这个全局变量:WNDPROC OldConsoleProc;

但它不起作用,我做错了什么?

【问题讨论】:

  • “它不起作用”是什么意思?你期望什么行为,你观察到什么?
  • 您不需要使用 FindWindow 搜索来获取控制台窗口句柄 - 只需使用 GetConsoleWindow(从 Vista 开始)。

标签: c winapi


【解决方案1】:

您不能以这种方式子类化另一个进程的窗口。 You can do it with hooks 但我不建议在控制台窗口上尝试这个。 ReadConsoleInput 足够低级,并且在没有丑陋的不可移植的黑客攻击的情况下可以达到的程度(我什至不确定当控制台窗口全屏时有一些事件会到达WndProc )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-26
    • 1970-01-01
    • 2023-03-28
    • 2014-12-15
    • 1970-01-01
    相关资源
    最近更新 更多