【问题标题】:How to run Outlook using Process.Start("outlook.exe") and get the control back如何使用 Process.Start("outlook.exe") 运行 Outlook 并取回控制权
【发布时间】:2020-07-23 23:00:03
【问题描述】:

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

我该如何解决我的问题?

【问题讨论】:

    标签: c# .net outlook console-application


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        这行得通:

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

        【讨论】:

          【解决方案4】:

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

          试试这个:

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

          这应该会导致启动进程并等待它可用,然后再尝试捕获它...

          【讨论】:

          • 感谢您的提示,但不幸的是,这个“while”没有帮助。
          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-30
            • 2017-01-22
            • 2015-03-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多