2011-06-04 120 views
0

我有一個應用程序需要在用戶單擊按鈕時激活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窗口?

回答

5

我想出了一個解決方案;我只是使用Process.Start()而不是使用任何WINAPI調用。我之前也試過這個,但它導致現有的Outlook窗口調整大小,這很煩人。祕訣是將/recycle參數傳遞給Outlook,這指示它重新使用現有窗口。調用看起來是這樣的:

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

我見過SetForegroundWindow有時失敗。嘗試使用SetWindowPos函數

+0

不幸的是,不能正常工作。我試過'SetWindowPos(hWnd,IntPtr.Zero,0,0,500,500,SWP_NOMOVE | SWP_NOSIZE)'。即使Outlook最小化,「SetForegroundWindow」和「SetWindowPos」的返回值都表示成功,並且「IsIconic」總是返回false。我開始認爲這是Outlook 2010的一些怪癖。 – Praetorian 2011-06-08 15:29:40

+0

哎喲......奇怪的行爲。作爲一種潛在的解決方法,可以嘗試啓動用戶的默認電子郵件應用程序,而不是直接關注Outlook。 (假設Outlook是他們的默認...) – 2011-06-10 13:27:12

+0

我該怎麼做? – Praetorian 2011-06-10 14:32:28

2

爲什麼不嘗試將Outlook產生爲新進程?我相信這是一個單一入口的應用程序(我在這裏忘記了我的正確術語),所以如果它已經打開,它就會把它推到最前面。

+0

我試過了,它確實喚醒了當前正在運行的Outlook實例,但是窗口被調整大小,所以很煩人。 – Praetorian 2011-06-15 13:11:04

1

此作品(您可能需要更改路徑):

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