C# 如何检测用户是否正在访问我已启动的outlook进程?

C# 如何检测用户是否正在访问我已启动的outlook进程?,c#,process,outlook,client-server,C#,Process,Outlook,Client Server,我有一个C#应用程序,在其中我通过Office PIA访问outlook,以便解析约会。在我的应用程序中,当我创建outlook对象时,会在任务管理器中创建一个新的outlook进程。关闭应用程序时,我也会退出outlook对象。这将关闭任务管理器中的outlook进程 我的问题是,当用户还与outlook交互时。特别是,如果用户打开了outlook,则当我的程序关闭时,我的程序也会关闭该用户的outlook程序。在观察任务管理器的同时,尝试手动和使用我的程序打开outlook,似乎只有一个ou

我有一个C#应用程序,在其中我通过Office PIA访问outlook,以便解析约会。在我的应用程序中,当我创建outlook对象时,会在任务管理器中创建一个新的outlook进程。关闭应用程序时,我也会退出outlook对象。这将关闭任务管理器中的outlook进程

我的问题是,当用户还与outlook交互时。特别是,如果用户打开了outlook,则当我的程序关闭时,我的程序也会关闭该用户的outlook程序。在观察任务管理器的同时,尝试手动和使用我的程序打开outlook,似乎只有一个outlook实例可以同时运行,然后用户和我的程序都访问同一个实例,因此当我从程序关闭outlook时,我也关闭了用户的程序


奇怪的是,事实并非如此。如果用户在我的程序运行时关闭outlook,他的窗口将消失,但outlook进程不会关闭,我的程序仍可以继续。这就好像该窗口只是outlook进程的一个客户端,尽管该窗口没有单独的进程。有没有办法让我知道,我的程序是否是唯一一个使用outlook进程的程序,或者是否有任何“用户窗口客户端”处于打开状态,这样我就可以避免在outlook仍在使用时关闭它?

我自己找到了一个解决方案。我发现outlook会跟踪有多少探险家在它上面打开。explorers为零不会导致进程关闭,但表示没有用户打开任何正常的outlook窗口,因此进程可以安全关闭。在我的项目中,我有一个访问outlook的类。我的解决方案是在该类的析构函数中测试零探索者(以下代码假定“使用Outlook=Microsoft.Office.Interop.Outlook;”):

当然,您必须小心关闭代码中使用的所有资源管理器,否则解决方案将不起作用,例如:

private void AccessOutlook(Outlook.MAPIFolder topfolder)
{
    Outlook.Explorer explorer = null;
    try
    {
        explorer = topFolder.GetExplorer();
        ... // do stuff with the explorer
    }
    finally
    {
        if (explorer != null)
        {
            ((Outlook._Explorer)explorer).Close();
        }
    }
}

不知道C#,但您创建的outlook对象中是否有任何内容显示“使用PID xxx启动新outlook”或“附加到现有outlook…”?您是否考虑过只打开outlook?Outlook的一般使用行为是人们总是让它整天运行。@Marc B:谢谢,但我没有发现这样的东西。不过,我找到了另一个解决方案,所以没问题。@Chris Lively:谢谢。我们考虑过这一点,如果在相对较短的时间内没有找到另一个解决方案,我们本可以做到这一点。
private void AccessOutlook(Outlook.MAPIFolder topfolder)
{
    Outlook.Explorer explorer = null;
    try
    {
        explorer = topFolder.GetExplorer();
        ... // do stuff with the explorer
    }
    finally
    {
        if (explorer != null)
        {
            ((Outlook._Explorer)explorer).Close();
        }
    }
}