【问题标题】:SendMessageTimeout sometimes fails silently when sending to the correct handle发送到正确句柄时,SendMessageTimeout 有时会静默失败
【发布时间】:2018-06-01 17:45:54
【问题描述】:

我们正在从一个进程 (process01) 向另一个进程 (process02) 发送一条 Win32 消息。

Console.WriteLine(targetHandle); // 0x3072a

SendMessageTimeout(
    targetHandle, 
    WM_COPYDATA, 
    IntPtr.Zero, 
    ref cds, 
    SendMessageTimeoutFlags.SMTO_NORMAL, 
    timeoutMs, 
    out result);

我们已经确定 process01 正在发送到正确的句柄。有时消息到达 process02,有时没有到达。

// SomeForm.cs
protected override void WndProc(ref Message m) {
    // Sometimes the message arrives here

    Console.WriteLine(m); // 0x3072a
}

当消息没有到达process02时,process01中没有错误消息。它只是默默地失败了。

这可能是什么原因造成的?我们如何进一步解决这个问题?我们使用 Spy++ 来搜索和收听接收句柄的消息。 Spy++ 总是通过它的句柄找到进程。当消息没有出现在SomeForm.WndProc 中时,它也不会出现在 Spy++ 消息中。

【问题讨论】:

  • 您正在使用旨在失败的功能。如果您不检查它的返回值,那么您将无法发现它确实如此。 timeoutMs 值必须足够健壮,以处理由于空闲 RAM 不足的繁忙机器导致的长时间停顿,请不要强迫我们猜测。
  • 您可以让进程 2 将消息传回进程 1 吗?
  • @HansPassant 函数的返回值为0

标签: c# windows winforms sendmessage


【解决方案1】:

问题是权限提升:

  • 发送会话未提升,并且
  • 接收会话已提升(即以管理员身份运行)。

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 2017-03-26
    相关资源
    最近更新 更多