如何使用 Process.Start( "outlook.exe" ) 运行 Outlook 并取回控制权



我的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才能重新启动控制台应用程序,最后在我的控制台应用程序上阅读"确定"。

如何解决我的问题?

>Microsoft写了一个关于如何登录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 框架中有很多方法可以防止这两个问题(例如使用等待句柄、后台工作线程或锁定)

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

此外,您可能会发现以下文章很有帮助:

  • 如何使用 Visual C# .NET 创建可编辑的预填充电子邮件,从而自动执行 Outlook 和 Word
  • 如何使用 Visual C# 自动执行 Office 程序的运行实例

这有效:

public static void StartOutlookIfNotRunning()
{
    string OutlookFilepath = @"C:Program Files (x86)Microsoft OfficeOffice12OUTLOOK.EXE";
    if (Process.GetProcessesByName("OUTLOOK").Count() > 0) return;
    Process process = new Process();
    process.StartInfo = new ProcessStartInfo(OutlookFilepath);
    process.Start();
}
<</div> div class="one_answers">

改用采用ProcessStartInfoProcess.Start重载,以便可以设置UseShellExecute

var startInfo = new ProcessStartInfo()
{
  FileName = "Outlook.exe",
  UseShellExecute = true
};
Process.Start(startInfo);
也许

这个过程需要一些时间才能开始。

试试这个:

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

这应该会导致启动过程并等到它可用后再尝试捕获它......

最新更新