我正在向控制台游戏引擎编写鼠标输入,但是每次我按下鼠标右键并弄乱事件时都会弹出上下文菜单。
我的程序中的输入由附加到控制台的子窗口处理:
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()
才能制作旋转相机。
控制台窗口对我来说是一个图形输出。
有什么方法可以禁用父窗口输入处理吗?还是由于两个窗口正在处理来自鼠标的输入,导致这种行为的原因是什么?
答案 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来将键盘焦点设置到附加到另一个线程的消息队列的窗口。