.net 无法获取Outlook,在非Outlook窗口出现在前台之前,Outlook正在运行应用程序

ppcbkaq5  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(139)

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();

没有效果。任何投入都会受到重视。谢谢!

nlejzf6q

nlejzf6q1#

不要在Outlook中使用GetActiveObject-它是一个单独的对象,因此创建Outlook.Application对象的新示例将返回一个指向现有示例的指针(如果它已经在运行)。

bxjv4tth

bxjv4tth2#

事实上,这就是微软所说的“优化”和"设计“的记录行为:
当Office应用程序启动时,它不会立即注册其正在运行的对象。这优化了应用程序的启动过程。Office应用程序不是在启动时注册,而是在失去焦点后在ROT中注册其正在运行的对象。因此,如果您尝试在应用程序失去焦点之前使用GetObject或GetActiveObject附加到Office应用程序的正在运行的示例,您可能会收到上述错误之一。
报价来自thisarchive 1archive 2)支持页面。
作为一种解决方案,他们建议将焦点翻转到另一个窗口:
使用代码,可以将焦点从Office应用程序更改为您自己的应用程序(或其他应用程序)

相关问题