Программно активировать Outlook - PullRequest
0 голосов
/ 04 июня 2011

У меня есть приложение, которое должно активировать 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 ]

5 голосов
/ 28 июня 2011

Я нашел решение;вместо любых вызовов WINAPI я просто использовал Process.Start().Я тоже пробовал это раньше, но это привело к изменению размера существующего окна Outlook, что раздражало.Секрет в том, чтобы передать аргумент /recycle в Outlook, это дает ему команду повторно использовать существующее окно.Звонок выглядит так:

Process.Start( "OUTLOOK.exe", "/recycle" );
2 голосов
/ 15 июня 2011

Почему бы не попробовать запустить Outlook как новый процесс?Я считаю, что это однократное приложение (я забыл свою правильную терминологию здесь), поэтому, если оно уже открыто, оно просто выведет его на первый план.

1 голос
/ 08 февраля 2017

Это работает (возможно, вам придется изменить путь):

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();
}
0 голосов
/ 04 июня 2011

Я видел сбой SetForegroundWindow.Попробуйте использовать функцию SetWindowPos

...