我有一个应用程序需要在用户单击按钮时激活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窗口?
答案 0 :(得分:5)
我想出了一个解决方案;我只使用Process.Start()
而不是使用任何WINAPI调用。我之前也试过这个,但它导致现有的Outlook窗口调整大小,这很烦人。秘诀是将/recycle
参数传递给Outlook,这指示它重用现有窗口。电话看起来像这样:
Process.Start( "OUTLOOK.exe", "/recycle" );
答案 1 :(得分:2)
为什么不尝试将Outlook作为一个新进程生成?我相信这是一个单入口应用程序(我在这里忘记了我的正确术语),所以如果它已经打开,它就会把它带到最前面。
答案 2 :(得分: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();
}
答案 3 :(得分:0)
我见过SetForegroundWindow有时会失败。尝试使用SetWindowPos功能