Программно активировать Outlook

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


person Praetorian    schedule 04.06.2011    source источник


Ответы (4)


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

Process.Start( "OUTLOOK.exe", "/recycle" );
person Praetorian    schedule 28.06.2011

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

person Jahmic    schedule 15.06.2011
comment
Я попробовал это, и он пробуждает запущенный в данный момент экземпляр Outlook, однако размер окна изменяется, поэтому это раздражает. - person Praetorian; 15.06.2011

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

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();
}
person B. Clay Shannon    schedule 08.02.2017

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

person Daniel Walker    schedule 04.06.2011
comment
К сожалению, это тоже не работает. Я пробовал SetWindowPos( hWnd, IntPtr.Zero, 0, 0, 500, 500, SWP_NOMOVE | SWP_NOSIZE ). Возвращаемые значения для SetForegroundWindow и SetWindowPos указывают на успех, а IsIconic всегда возвращает false, даже когда Outlook свернут. Я начинаю думать, что это какая-то особенность Outlook 2010. - person Praetorian; 08.06.2011
comment
Ой... Странное поведение. В качестве потенциального обходного пути, вместо того, чтобы напрямую фокусироваться на Outlook, попробуйте запустить почтовое приложение пользователя по умолчанию? (Предполагая, что Outlook используется по умолчанию...) - person Daniel Walker; 10.06.2011
comment
Самый простой способ: Process.Start(mailto:[email protected]); Это вызовет обработчик протокола mailto:, который является почтовым клиентом по умолчанию. - person Daniel Walker; 13.06.2011