以程序方式激活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窗口?
我找到了一个解决方案;我没有使用任何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函数