Pinvoke SendMessage之后C#代码挂起

时间:2014-01-31 20:50:41

标签: c# pinvoke sendmessage

我正在为单独的Windows窗体应用程序自动化测试过程。我目前正在使用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()没有运行之后的任何代码行。

任何人都可以帮忙解释一下这里会发生什么吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

SendMessage将阻止,直到呼叫接收者完成处理消息。

您可以改为调用PostMessage,这将允许您的程序在分派消息后立即继续执行。

答案 1 :(得分:3)

这可能是由于(来自documentation):

  

SendMessage调用指定窗口和的窗口过程   在窗口过程处理完消息之后才会返回

我不确定目标窗口究竟是什么作为对您的消息的响应,但如果它停止传送消息(例如等待用户输入),那么您自己的程序也会停止并等待。

另一种选择是PostMessage,它总是在不等待的情况下返回。

答案 2 :(得分:0)

这是错字吗?接收按钮消息的窗口与找到的窗口不同。通常,对窗口的消息proc进行结构化,以便将未处理的消息传递给默认的窗口proc,并且通常将其设计为快速。但是,如果由于任何原因导致窗口proc无法返回,则该应用程序将被挂起。难道是childHandle的消息处理过程陷入了无限循环?有一个特殊的窗口句柄0xffff,它指示该消息应发送到当前正在运行的所有应用程序的所有顶级窗口。或者,使用PostMessage代替SendMessage。 PostMessage将始终立即返回。

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