如何使用Process.Start(“outlook.exe”)运行Outlook并获取控制权

时间:2014-12-11 11:37:42

标签: c# .net outlook console-application

我的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才能重新启动控制台应用程序,最后在我的控制台应用程序上读取“OK”。

如何解决我的问题?

5 个答案:

答案 0 :(得分:2)

无需使用Process.Start方法运行新进程。相反,您可以将Outlook引用添加到C#项目并创建Application类的新实例。有关详细信息,请参阅C# app automates Outlook (CSAutomateOutlook)示例项目。

您还可以找到以下文章:

答案 1 :(得分:1)

Microsoft写了一篇关于如何登录Outlook实例的example。虽然这是您在问题中直接要求的,但该示例包含如何以预期方式启动新的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。这意味着您将在应用程序无效时使用CPU电源。 2.让你的GUI完全没有响应,如果多次调用thread.sleep,Windows会建议关闭进程(整个屏幕变白,最后你得到一个弹出窗口,询问你是否要等待或者只是关闭它)。 .net框架中有很多方法可以防止这两个问题(例如使用等待句柄,后台工作程序或锁定)

答案 2 :(得分:1)

这有效:

public static void StartOutlookIfNotRunning()
{
    string OutlookFilepath = @"C:\Program Files (x86)\Microsoft Office\Office12\OUTLOOK.EXE";
    if (Process.GetProcessesByName("OUTLOOK").Count() > 0) return;
    Process process = new Process();
    process.StartInfo = new ProcessStartInfo(OutlookFilepath);
    process.Start();
}

答案 3 :(得分:0)

可能需要一段时间才能启动。

试试这个:

  if (Process.GetProcessesByName("OUTLOOK").Count().Equals(0))
  {
    Process.Start("outlook.exe"); // MY PROGRAM STOPS HERE
  }

  while ((Process.GetProcessesByName("OUTLOOK").Count().Equals(0));

  var process = Process.GetProcessesByName("OUTLOOK").First();

这应该导致启动过程并等到它可用之后再尝试抓住它......

答案 4 :(得分:0)

使用def home away def2 1 BAL DEN BAL DEN 2 DEN DEN BAL BAL 3 DEN BAL DEN BAL 的{​​{1}}重载代替,因此您可以设置Process.Start

ProcessStartInfo