【发布时间】:2019-09-24 11:48:25
【问题描述】:
我正在向控制台游戏引擎编写鼠标输入,但每次按下鼠标右键都会弹出上下文菜单并弄乱我的事件。
我的程序中的输入由附加到控制台的子窗口处理:
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() 来制作旋转相机。
控制台窗口用作图形输出。
有没有办法禁用父窗口输入处理?或者什么会导致这种行为,因为来自鼠标的输入正在由两个窗口处理?
【问题讨论】:
-
@pmg 我真的不知道如何做到这一点,因为我正在处理子窗口中的事件,接收焦点。因为我不能直接从控制台捕获任何东西,因为它在一个单独的进程中
-
这与CMD无关。 CMD 是一个控制台程序,类似于您的用于操作计算机的控制台程序。
SetConsoleModeENABLE_MOUSE_INPUT - 如果鼠标指针位于控制台窗口的边界内并且窗口具有键盘焦点,则由鼠标移动和按钮按下产生的鼠标事件将放置在输入缓冲区中。即使启用此模式,这些事件也会被 ReadFile 或 ReadConsole 丢弃。 -
@CodyGray 不,没错,RawInput 是必需的,因为我使用类似射击游戏的相机,如果我使用 WM_MOUSEMOVE,那么如果我的光标到达边界,它将停止。但我可以使用 ReadConsoleInput 的一部分来忽略 WM_CONTEXTMENU
-
此评论线程正在讨论on Meta。