在Windows 7中的EnableWindow之后的SendInput

时间:2010-01-29 06:12:01

标签: winapi windows-7 window

我有一个在父母中最大化的子窗口。

需要禁用它,以便在按下某个键之前它不会接收输入。 例如,当我按下'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位但仍然没有运气。如果始终启用子窗口,则输入可以正常工作。

感谢任何帮助。

2 个答案:

答案 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);