2014-09-02 78 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

相關問題