Marshal.GetActiveObject("Outlook.Application")
在Outlook启动时引发Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
,并在Outlook运行时继续引发,直到非Outlook窗口成为活动的前台窗口。
我正在Windows 10版本1803内部版本17134.523(这是我的本地计算机)上运行Outlook版本1901内部版本11231.20130。我观察到客户端计算机没有这种行为。这发生在使用.NET 4.5.2和通过NuGet获得的Microsoft.Office.Interop.Outlook版本15.0.4797.1003的WPF应用程序中。
我已经反复运行了以下代码。如上所述,一旦Outlook的一个示例被最小化或一个非Outlook窗口被设置为前台,它就会成功,但在此之前它可能会连续失败(输出如下)。我已经尝试暂停约20-30秒,给予Outlook时间加载,但仍然得到相同的结果。
// Detect that the active window is an Outlook window
Outlook.Application app = null;
// Optional: Wait for Outlook to load 20-30 sec using Thread.Sleep
try
{
Debug.WriteLine("app");
app = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
Debug.WriteLine("got app");
}
catch (Exception exception)
{
Debug.WriteLine(exception.Message);
}
// Do things with app
Outlook运行时,我希望看到:
app
got app
如果自Outlook启动后将非Outlook窗口设置为前台(即不是资源管理器或检查器窗口),则会出现此问题。如果Outlook正在运行并且一直处于前台,则我会看到:
app
Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
作为一种尝试,当我注意到发生这种情况时,我尝试通过执行以下操作来“ Boot ”Interop:
bootApplication = new Microsoft.Office.Interop.Outlook.Application();
没有效果。任何投入都会受到重视。谢谢!
2条答案
按热度按时间nlejzf6q1#
不要在Outlook中使用
GetActiveObject
-它是一个单独的对象,因此创建Outlook.Application
对象的新示例将返回一个指向现有示例的指针(如果它已经在运行)。bxjv4tth2#
事实上,这就是微软所说的“优化”和"设计“的记录行为:
当Office应用程序启动时,它不会立即注册其正在运行的对象。这优化了应用程序的启动过程。Office应用程序不是在启动时注册,而是在失去焦点后在ROT中注册其正在运行的对象。因此,如果您尝试在应用程序失去焦点之前使用GetObject或GetActiveObject附加到Office应用程序的正在运行的示例,您可能会收到上述错误之一。
报价来自this(archive 1,archive 2)支持页面。
作为一种解决方案,他们建议将焦点翻转到另一个窗口:
使用代码,可以将焦点从Office应用程序更改为您自己的应用程序(或其他应用程序)