簡體   English   中英

Pinvoke SendMessage之后C#代碼掛起

[英]C# Code hangs after Pinvoke SendMessage

我正在為一個單獨的Windows Form應用程序自動化測試過程。 我目前正在使用pinvoke與其他應用程序進行通信。 在此應用程序中,有一個按鈕,當單擊該按鈕時會創建一個新的彈出窗口。

我正在與按鈕和字段成功通信。 但是,單擊按鈕時,SendMessage()之后的代碼不會運行。 單擊該按鈕成功並出現窗口,但是直到我手動關閉窗口后,以下代碼才運行。

這是我的代碼:

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

    buttonHandle = FindWindowEx(parentHandle, new IntPtr(0), new IntPtr(0), windowTitle);
    SendMessage(childHandle, BM_CLICK, new IntPtr(0), "");
    MessageBox.Show("This won't show until I close the window");

一切正常,除非在我關閉單擊按鈕時創建的新窗口之前,沒有運行SendMessage()之后的任何代碼行。

有人可以幫忙解釋一下這里發生了什么嗎?

謝謝!

SendMessage將阻塞,直到呼叫的接收者完成了對消息的處理。

您可以改為調用PostMessage,這將使您的程序在分派消息后立即繼續執行。

可能是由於該原因(來自文檔 ):

SendMessage調用指定窗口的窗口過程, 直到該窗口過程處理完該消息后才返回

我不確定目標窗口究竟對您的消息做出了什么反應,但是如果它停止發送消息(例如,等待用戶輸入),那么您自己的程序也會停止並等待。

替代方法是PostMessage ,它總是不等待就返回。

這是錯字嗎? 接收按鈕消息的窗口與找到的窗口不同。 通常,對窗口的消息proc進行結構化,以便將未處理的消息傳遞給默認的窗口proc,並且通常將其設計為快速。 但是,如果由於任何原因導致窗口proc無法返回,則該應用程序將被掛起。 難道是childHandle的消息處理過程陷入了無限循環? 有一個特殊的窗口句柄0xffff,它指示該消息應發送到當前正在運行的所有應用程序的所有頂級窗口。 或者,使用PostMessage代替SendMessage。 PostMessage將始終立即返回。

buttonHandle = FindWindowEx(parentHandle,新的IntPtr(0),新的IntPtr(0),windowTitle); SendMessage(childHandle,BM_CLICK,new IntPtr(0),“”);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM