我刚才遇到了这个问题,因为我有同样的挑战。我对接受的答案并不完全满意,因为这意味着我必须确定Outlook.exe
. “脱壳Outlook.exe
”不起作用。因此,我寻找并找到了另一种解决方案。但在我介绍之前,让我们看看Outlook.exe
如果你想这样做,你如何确定完整的路径。
要确定 的完整路径Outlook.exe
,您需要Path
从
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\16.0\Outlook\InstallRoot
注册表项(假设您有 Office 16,又名 Office 2016 或 2019)并构建Outlook.exe
. 在我的机器上,Path
值为
C:\Program Files\Microsoft Office\root\Office16
所以完整的路径是
C:\Program Files\Microsoft Office\root\Office16\Outlook.exe
但是,您需要考虑到用户可能安装了较旧的(例如,Office 15,又名 Office 2013)或较新的 Office 版本,并选择适当的注册表项。您还可以通过检索默认值来获取 Office 版本
HKEY_CLASSES_ROOT\Outlook.Application\CurVer
键(例如,Outlook.Application.16
)。由此,您可以推断版本号(例如,16
)并构建您的注册表项的片段(例如,16.0
)。或者您可以尝试使用Outlook\InstallRoot
具有Path
值的子键来查找键。无论如何,您可能会明白我为什么要避免这种情况。
因此,让我们看一个更简单的解决方案,注意我正在使用多个 Office 应用程序,因此具有以下 using 指令:
using Outlook = Microsoft.Office.Interop.Outlook;
如果当前没有窗口可见,为了让 Outlook 显示其主窗口,我编写了以下实用程序方法:
private static void EnsureOutlookIsVisible(Outlook.Application outlook)
{
object window = null;
NameSpace ns = null;
MAPIFolder folder = null;
try
{
// Check whether Outlook has an active window. If so, Outlook is visible
// and we don't have to do anything.
window = outlook.ActiveWindow();
if (window != null) return;
// No active window is shown, so Outlook is not visible and we need to
// have Outlook display a window.
ns = outlook.GetNamespace("MAPI");
folder = ns.GetDefaultFolder(OlDefaultFolders.olFolderInbox);
folder.Display();
}
finally
{
folder.ReleaseComObject();
ns.ReleaseComObject();
window.ReleaseComObject();
}
}
上述方法使用以下扩展方法来释放 COM 对象:
public static void ReleaseComObject<T>(this T resource) where T : class
{
if (resource != null && Marshal.IsComObject(resource))
{
Marshal.ReleaseComObject(resource);
}
}
使用上述方法,要附加到新的或现有的 Outlook 进程并确保 Outlook 显示其主窗口,您只需要以下两行代码:
var outlook = new Outlook.Application();
EnsureOutlookIsVisible(outlook);