我有一个在父母中最大化的子窗口。
需要禁用它,以便在按下某个键之前它不会接收输入。 例如,当我按下'A'键时,我想要启用子窗口,接收使用SendInput()发送的输入并再次禁用。
所以我这样做:
EnableWindow( hwnd, TRUE );
SetForegroundWindow( hwnd);
SetFocus( hwnd);
Sleep(50);
SendInput()...x7-8 times
EnableWindow( hwnd, FALSE );
现在,EnableWindow函数工作正常,除了窗口错过了一些输入。我试图在EnableWindow之后加一些延迟(比如6-7秒!!)但它仍然无法正常工作。
我尝试让SetWindowPos()更新它的帧,我尝试手动设置WS_DISABLE位但仍然没有运气。如果始终启用子窗口,则输入可以正常工作。
感谢任何帮助。
答案 0 :(得分:2)
子窗口由与其父窗口相同的线程提供服务。因此,发送SendInput没有任何好处,除非您在再次禁用窗口之前返回泵并处理事件。
如果你解释一下你想要完成什么,我们可能会给你一个更好的方法。但无论如何,至少你需要在SendEvents之后运行一个消息泵,直到你的事件用完为止。
请注意,泵将还泵送其他消息,因此可能会使您的整个设计失效。但是,就是这样。
// process messages until the queue is empty.
//
MSG msg;
while (PeekMessage(&msg, NULL, 0, PM_REMOVE))
{
// make sure we don't eat the quit message.
if (WM_QUIT == msg.message)
{
PostQuitMessage();
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
哦,Sleep()没有做任何有用的事情,你可以把它拿出来。
编辑:此代码在SendInput
调用之后和禁用窗口之前进行。
您可能还想使用它而不是Sleep()
来让窗口安定下来
你SendInput
。
答案 1 :(得分:0)
我会尝试将键盘或鼠标消息直接发送到子窗口,而不是SendInput
。例如:
EnableWindow(hwnd, TRUE);
SendMessage(hwnd, WM_KEYDOWN, ..., ...);
SendMessage(hwnd, WM_KEYUP, ..., ...);
// etc...
EnableWindow(hwnd, FALSE);