发送到正确的句柄时,SendMessageTimeout 有时会无提示地失败

SendMessageTimeout sometimes fails silently when sending to the correct handle

我们正在从一个进程 (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++ 消息中。

问题是权限提升:

  • 发送会话未提升,
  • 接收会话已提升(即 运行 作为管理员)。