0

我们发现调用

myMailItem.Display(false)

方法在我们的开发机器上运行良好,因为它在用户的前台打开消息窗口。无论我们是在 VS 中运行/附加调试器还是仅作为已安装的应用程序运行。

然而,在某些客户的机器上,消息在我们的 Winforms 应用程序后面打开。

Windows的版本似乎没有任何区别。

这是可以解释和预测的吗?

当然,我们可以尝试设置 SetForegroundWindow,但我更希望能够理解为什么差异并在我们的开发机器上重现“问题”,然后再盲目地尝试 SetForegroundWindows 等。

4

1 回答 1

1

这是一个很正常的事故。用于显示邮件项目的窗口归另一个进程 Outlook.exe 所有。一个进程是否可以将它自己的一个窗口推到前台是一个废话,Windows 窗口管理器使用的基本启发式方法在这篇 MSDN 库文章中进行了描述。

在您自己的机器上为此获得一致的复制将很困难。我在更高版本的 Windows 上观察到的一件事是时间似乎也起作用。应用程序创建窗口所需的时间越长,它无法工作并最终落后于当前前景窗口的可能性就越大。之前已经很常见了,因为输入事件发挥了作用。开发机器的典型问题是它们的马力太大:)

避免这种情况的唯一一致方法是将您的应用程序编写为 Outlook 加载项,以便您的窗口由与 Outlook 窗口相同的进程和线程拥有。那艘船可能很久以前就航行了。下一个最好的事情是最大化 Outlook 成功的几率,将前台窗口强制为 Outlook 窗口。不幸的是,很难做到,请查看这篇文章的代码。使用 Spy++ 检查窗口类名是否仍然准确。并最小化您自己的窗口,使其完全不受 Outlook 窗口的影响,并且不可能获得任何输入事件。

于 2014-01-13T12:57:06.697 回答