2014-09-02 79 views
-1

我遇到这个问题,发布一些WM_KEYDOWN/WM_KEYUP消息后,我需要使用Thread.Sleep至少200ms,然后才能发布WM_LMOUSEDOWN/WM_LMOUSEUP消息。如果我不这样做,收件人首先处理鼠标单击,这意味着较早的击键会转到目标句柄的错误位置。 我无法使用SendMessage,因为收件人将这些忽略为WM_KEYDOWN/WM_KEYUP。有什么方法可以等待接收者处理PostMessage?

有没有办法等待PostMessage被处理?

+0

为什么你必须伪造输入? – 2014-09-02 01:14:11

+0

用于ui自动化。 – xamid 2014-09-02 01:15:47

+2

呃,UI自动化有UIAutomation – 2014-09-02 01:16:48

回答

3

有什么办法可以等待PostMessage被处理吗?

不,没有。没有API允许您等待或收到已收到已发送邮件的通知。

+0

但是,有['SendMessageCallback'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms644951.aspx),它基本上做到了这一点。即使消息没有被发布(并且因此被移动到输入队列的前面),但是就目标应用而言,在跨线程使用时效果是相同的。除了从队列中检索第一条消息之外,对于GetMessage的调用会在向前移动以从消息队列中检索第一条消息之前,调度其他线程发送的所有队列消息**。 – IInspectable 2014-09-02 13:43:04

+0

@IInspectable这不是真的可比。发送的消息直接发送到窗口过程。发布的消息通过调用GetMessage来获取,并在消息循环中处理。通常但不一定要调用'TranslateMessage'然后调用'DispatchMessage'。很难确切知道目标应用是或正在做什么。 – 2014-09-02 13:45:17

+0

当'SendMessage'穿过线程时,发送的消息作为全部排队。它们不会立即派发,还需要调用'GetMessage' /'PeekMessage'来分派。当交叉线程时,'SendMessageNotify'(或'SendMessageCallback')和'PostMessage'几乎完全相同。 – IInspectable 2014-09-02 13:57:49

-1

是的,有:只使用SendMessage代替PostMessage(请注意,使用不同的线程和GUI线程偶然等待在此线程以任何理由时SendMessage函数造成死锁风险)

一般:如果你需要伪造输入你不应该自己发布消息。相反,你应该使用SendInput()

+0

正如我写的,它需要是PostMessage,因为SendMessage被目标应用程序忽略。 – xamid 2014-09-23 17:34:24

+0

这不是答案,SendMessage是不好的,可能会导致内存问题等(它不会等待任何其他消息) – 2016-05-22 18:47:32

+0

@vtz SendMessage正常工作。它是Win32的重要组成部分。你面对的任何问题都是由于你自己的代码存在缺陷,滥用SendMessage等。 – 2016-05-23 05:54:48

相关问题