以程序方式激活Outlook

本文关键字:Outlook 激活 方式 程序 | 更新日期: 2023-09-27 17:58:26

我有一个应用程序,当用户单击按钮时,它需要激活Outlook(如果它正在运行)。我试过以下方法,但不起作用。

在窗口类中声明:

[DllImport( "user32.dll" )]
private static extern bool SetForegroundWindow( IntPtr hWnd );
[DllImport( "user32.dll" )]
private static extern bool ShowWindowAsync( IntPtr hWnd, int nCmdShow );
[DllImport( "user32.dll" )]
private static extern bool IsIconic( IntPtr hWnd );

在按钮Click处理程序内:

// Check if Outlook is running
var procs = Process.GetProcessesByName( "OUTLOOK" );
if( procs.Length > 0 ) {
  // IntPtr hWnd = procs[0].MainWindowHandle; // Always returns zero
  IntPtr hWnd = procs[0].Handle;
  if( hWnd != IntPtr.Zero ) {
    if( IsIconic( hWnd ) ) {
      ShowWindowAsync( hWnd, SW_RESTORE );
    }
    SetForegroundWindow( hWnd );
  }
}

无论Outlook当前是最小化到任务栏、最小化到系统托盘还是最大化,这都不起作用。如何激活Outlook窗口?

以程序方式激活Outlook

我找到了一个解决方案;我没有使用任何WINAPI调用,而是简单地使用了CCD_ 2。我早些时候也尝试过,但它导致现有的Outlook窗口调整大小,这很烦人。秘密是将/recycle参数传递给Outlook,这指示它重用现有窗口。通话内容如下:

Process.Start( "OUTLOOK.exe", "/recycle" );

为什么不尝试将Outlook作为一个新进程?我相信这是一个单一的应用程序(我忘记了这里的正确术语),所以如果它已经开放,它只会把它带到最前沿。

这很有效(您可能需要更改路径):

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

我偶尔看到SetForegroundWindow失败。尝试使用SetWindowPos函数