发送到正确的句柄时,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++ 消息中。
问题是权限提升:
- 发送会话未提升,
- 接收会话已提升(即 运行 作为管理员)。
我们正在从一个进程 (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++ 消息中。
问题是权限提升:
- 发送会话未提升,
- 接收会话已提升(即 运行 作为管理员)。