Win32通话订单

时间:2010-04-02 00:42:20

标签: winapi

我有两个窗口,我发送脚本输入。程序如此

BringWindowToTop( window1 );
i = Build input structures( window1 );
SendInput(i);

BringWindowToTop( window2 );
i = Build input structures( window2 );
SendInput(i);

我遇到输入未被发送和正确时间的问题。我在每次调用后都设置了延迟,并且看到第一个SendInput()的输入在window2被放到顶部之后被处理。在循环结束时也是如此。

SendInput调用是否已缓冲?如果是这样,我如何确保此代码的串行执行?

由于

2 个答案:

答案 0 :(得分:1)

与Win32中的大多数消息一样,输入经历了两个阶段。首先,它被发布到队列中。此时,目标窗口已经确定。然后当接收程序空闲时,它被处理。即使在Z顺序中提出第二个窗口之后才可能处理输入,输入消息应该排队到第一个窗口。

行为是否仅依赖于输入所在的窗口,或者在完全处理消息时程序是否也必须位于最前面?

无论如何,既然你试图将输入发送到特定的窗口而不是用户激活的内容,为什么不将WM_BUTTONDOWN和WM_KEYPRESS之类的事件直接发送到目的地呢?

答案 1 :(得分:0)

来自MSDN页面:

  

SendInput函数将INPUT结构中的事件串行插入键盘或鼠标输入流。这些事件没有穿插用户(使用键盘或鼠标)或通过调用keybd_event,mouse_event或其他对SendInput的调用插入的其他键盘或鼠标输入事件。

因此,SendInput正在插入到输入流中,可能是BringWindowToTop正在串行执行,或者插入到先处理的事件队列中。也许你可以找到一个事件来调用第二个SendInput,这将在第一个窗口被带到前面后执行。