1

我有一个应用程序需要在用户单击按钮时激活 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 窗口?

4

4 回答 4

6

我想出了一个解决方案;而不是使用我简单使用的任何 WINAPI 调用Process.Start()。我之前也尝试过,但它导致现有 Outlook 窗口调整大小,这很烦人。秘诀是将/recycle参数传递给 Outlook,这指示它重用现有窗口。调用如下所示:

Process.Start( "OUTLOOK.exe", "/recycle" );
于 2011-06-28T15:24:23.807 回答
2

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

于 2011-06-15T08:24:11.103 回答
2

这有效(您可能必须更改路径):

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();
}
于 2017-02-08T17:14:26.713 回答
0

我见过 SetForegroundWindow 有时会失败。尝试使用SetWindowPos函数

于 2011-06-04T03:53:13.343 回答