如何使用 Process.Start("outlook.exe") 运行 Outlook 并重新获得控制权

2024-02-21

我的 C# 程序需要启动 Office Outlook 并获取当前的“正在运行的 Outlook 应用程序”。 为了做到这一点,我实现了以下简单的程序(所以如果你愿意,你可以简单地测试它):

using Outlook = Microsoft.Office.Interop.Outlook;
using System.Runtime.InteropServices;

static void Main(string[] args)
{
  Outlook.Application outlookObj = null;

  if (Process.GetProcessesByName("OUTLOOK").Count().Equals(0))
  {
    Process.Start("outlook.exe"); // MY PROGRAM STOPS HERE
  }
  var process = Process.GetProcessesByName("OUTLOOK").First();
  while (!process.HasExited)
  {
    try
    {
      outlookObj = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
      break;
    }
    catch
    {
      outlookObj = null;
    }
    System.Threading.Thread.Sleep(10);
  }

  string result = (outlookObj== null)? "DOES NOT WORK" : "OK";
  Console.WriteLine(result);
  Console.ReadLine();
}

我的问题是,一旦 Office Outlook 开始运行,我的 C# 控制台应用程序就不会继续其工作。之后Process.Start("outlook.exe");指令执行后,我必须单击 Visual Studio GUI 才能重新启动控制台应用程序,最后在控制台应用程序上读取“确定”。

我该如何解决我的问题?


微软写了一个example http://msdn.microsoft.com/en-us/library/office/ff462097(v=office.15).aspx关于如何登录 Outlook 实例。尽管这正是您在问题中直接要求的,但该示例包含如何以预期方式启动新的 Outlook 应用程序

application = new Outlook.Application();

作为旁注:在您的示例中,您使用以下代码:

 while (!process.HasExited)
  {
    try
    {
      outlookObj = (Outlook.Application)Marshal.GetActiveObject("Outlook.Application");
      break;
    }
    catch
    {
      outlookObj = null;
    }
    System.Threading.Thread.Sleep(10);
  }

这在主线程中是不好的做法,因为您通过使用 thread.sleep 来应用“忙等待”。这意味着您将 1. 在您的应用程序不执行任何操作时使用 CPU 功率。 2. 让你的GUI完全无响应,如果多次调用thread.sleep,Windows会建议关闭进程(整个屏幕变白,最终你会看到一个弹出窗口,询问你是否要等待或直接关闭它) )。 .net 框架中有很多方法可以防止这两个问题(例如使用等待句柄、后台工作程序或锁定)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Process.Start("outlook.exe") 运行 Outlook 并重新获得控制权 的相关文章

随机推荐