【问题标题】:How to detect if a user is accessing an outlook process, that I have started?如何检测用户是否正在访问我已启动的 Outlook 进程?
【发布时间】:2011-02-25 17:11:56
【问题描述】:

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

我的问题是,当用户也在与 Outlook 交互时。具体来说,如果用户打开了 Outlook,当我的程序关闭时,我的程序也会关闭该用户的 Outlook 程序。尝试手动和我的程序打开 Outlook,同时观察任务管理器,似乎只有一个 Outlook 实例可以同时运行,然后用户和我的程序都访问同一个实例,所以当我从我的程序关闭前景,我也关闭了用户的程序。

奇怪的是,情况并非如此。如果用户在我的程序运行时关闭了outlook,他的窗口将会消失,但是outlook进程不会关闭,我的程序仍然可以继续运行。就好像该窗口只是 Outlook 进程的一个客户端,尽管该窗口没有单独的进程。有没有办法让我看看,如果我的程序是唯一使用 Outlook 进程的程序,或者是否有任何“用户窗口客户端”打开,那么我可以避免在 Outlook 仍在使用时关闭它?

【问题讨论】:

  • 不知道 C#,但您创建的 Outlook 对象中是否有任何内容显示“使用 PID xxx 启动新的 Outlook”或“附加到现有 Outlook ...”?
  • 您是否考虑过让 Outlook 保持打开状态? Outlook 的一般使用行为是人们通常让它整天运行。
  • @Marc B:谢谢,但我没有找到类似的东西。不过,我找到了另一种解决方案,所以没问题。
  • @Chris Lively:谢谢。如果在相对较短的时间内没有找到另一种解决方案,我们考虑过并且会这样做。

标签: c# process outlook client-server


【解决方案1】:

我自己找到了解决方案。事实证明,Outlook 会跟踪有多少探索者对其开放。达到零个资源管理器不会导致进程关闭,但它表明没有用户打开任何正常的 Outlook 窗口,因此可以安全地关闭进程。在我的项目中,我有一个访问 Outlook 的类。我的解决方案是在该类的析构函数中测试零资源管理器(以下代码假定“使用 Outlook = Microsoft.Office.Interop.Outlook;”):

~OutlookAccessor()
{
    try
    {
        Outlook.Application app = new Outlook.Application();
        if (app.Explorers.Count == 0)
        {
            ((Outlook._Application)app).Quit();
        }
        System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
    }
    catch (System.Runtime.InteropServices.COMException)
    {
        ; // nevermind, we're only trying to free the Outlook COM object, and the most probable cause for this exception is that office is not installed.
    }
}

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 2010-10-15
    • 2016-02-09
    相关资源
    最近更新 更多