有没有办法禁用cmd中的右键菜单?

时间:2019-05-06 20:30:08

标签: c windows winapi console

我正在向控制台游戏引擎编写鼠标输入,但是每次我按下鼠标右键并弄乱事件时都会弹出上下文菜单。

我的程序中的输入由附加到控制台的子窗口处理:

bool _CreateControl(HWND parent)
{
    WNDCLASSEX wx = {0};
    wx.cbSize = sizeof(WNDCLASSEX);
    wx.lpfnWndProc = HandleMessageSetup;        // function which will handle messages
    wx.hInstance = _GetInstance(self);
    wx.lpszClassName = this->wndClassName;

    if (RegisterClassEx(&wx)) 
    {
        this->Window = CreateWindowExW(0,
            this->wndClassName,
            L"dummy_name",
            WS_CHILD, 0, 0, 0, 0,     // make it a child
            parent,                   // parent here is console window
            NULL, _GetInstance(this), this);

        SetFocus(this->Window);       // give it a focus

        return true;
    }
    return false;
}

注意:正在另一个线程中创建此窗口的实例。

尽管我将焦点放在此窗口上以接收输入,但是鼠标右键仍会为控制台生成事件并生成上下文菜单。

现在,我正在处理RAWMOUSEINPUT并将WM_INPUT消息发送到我的窗口。这样做是因为我需要在DirectInput中稍微接近GetMouseRelative()才能制作旋转相机。

控制台窗口对我来说是一个图形输出。

有什么方法可以禁用父窗口输入处理吗?还是由于两个窗口正在处理来自鼠标的输入,导致这种行为的原因是什么?

2 个答案:

答案 0 :(得分:3)

您可以通过自定义鼠标输入消息来实现此目标,以禁用控制台的鼠标右键。

应注意,要添加ENABLE_EXTENDED_FLAGS(必须启用或禁用扩展标志)。

MSDN示例中未添加此内容,只有添加后才能处理鼠标消息。

fdwMode = ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT | ENABLE_EXTENDED_FLAGS;

此外,如果要禁用控制台的标题栏,则可以参考以下代码。

HWND hwnd = GetConsoleWindow();
LONG Style = GetWindowLong(hwnd, GWL_STYLE);
SetWindowLong(hwnd, GWL_STYLE, Style &~ WS_CAPTION);

答案 1 :(得分:-2)

您必须钩住SetFocus函数,否则必须指定WM_KILLFOCUS不适用于您正在使用的命令提示符窗口。

  

SetFocus函数将WM_KILLFOCUS消息发送到失去键盘焦点的窗口,并将WM_SETFOCUS消息发送到接收键盘焦点的窗口。它还会激活接收焦点的窗口或接收焦点的窗口的父窗口。

     

如果窗口处于活动状态但没有焦点,则按下任何键都会产生WM_SYSCHAR,WM_SYSKEYDOWN或WM_SYSKEYUP消息。如果还按下VK_MENU键,则消息的 lParam 参数将设置为30位。否则,产生的消息没有设置该位。   通过使用AttachThreadInput函数,线程可以将其输入处理附加到另一个线程。这允许线程调用SetFocus来将键盘焦点设置到附加到另一个线程的消息队列的窗口。

Excerpt from SetFocus at docs.microsoft.com