【问题标题】:C# Code hangs after Pinvoke SendMessagePinvoke SendMessage 后 C# 代码挂起
【发布时间】:2014-01-31 20:50:40
【问题描述】:

我正在为单独的 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() 之后出现的任何代码行,直到我关闭单击按钮时创建的新窗口。

谁能帮忙解释一下这里可能发生了什么?

谢谢!

【问题讨论】:

    标签: c# pinvoke sendmessage


    【解决方案1】:

    SendMessage 将一直阻塞,直到呼叫的接收者完成对消息的处理。

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

    【讨论】:

      【解决方案2】:

      可能是因为这个(来自documentation):

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

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

      对此的替代方法是PostMessage,它总是无需等待即可返回。

      【讨论】:

        【解决方案3】:

        这是一个错字吗?接收按钮消息的窗口与找到的窗口不同。通常,窗口的消息过程是结构化的,以便将未处理的消息传递给默认的窗口过程,并且通常被设计为快速。但是,如果窗口 proc 出于某种原因未能返回,则应用程序将挂起。会不会是 childHandle 的 message proc 处于无限循环中?有一个特殊的窗口句柄 0xffff,它表示消息应该发送到当前运行的所有应用程序的所有顶层窗口。或者,使用 PostMessage 而不是 SendMessage。 PostMessage 总是会立即返回。

        buttonHandle = FindWindowEx(parentHandle, new IntPtr(0), new IntPtr(0), windowTitle); SendMessage(childHandle, BM_CLICK, new IntPtr(0), "");

        【讨论】:

          猜你喜欢
          • 2021-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-11
          • 1970-01-01
          • 1970-01-01
          • 2011-03-06
          • 1970-01-01
          相关资源
          最近更新 更多