ShowWindowAsync(wnd.hWnd,SW_SHOW); SetForegroundWindow(wnd.hWnd); // Code from Karl E. Peterson,www.mvps.org/vb/sample.htm // Converted to Delphi by Ray Lischner // Published in The Delphi Magazine 55,page 16 // Converted to C# by Kevin Gale IntPtr foregroundWindow = GetForegroundWindow(); IntPtr Dummy = IntPtr.Zero; uint foregroundThreadId = GetWindowThreadProcessId(foregroundWindow,Dummy); uint thisThreadId = GetWindowThreadProcessId(wnd.hWnd,Dummy); if (AttachThreadInput(thisThreadId,foregroundThreadId,true)) { BringWindowToTop(wnd.hWnd); // IE 5.5 related hack SetForegroundWindow(wnd.hWnd); AttachThreadInput(thisThreadId,false); } if (GetForegroundWindow() != wnd.hWnd) { // Code by Daniel P. Stasinski // Converted to C# by Kevin Gale IntPtr Timeout = IntPtr.Zero; SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,Timeout,0); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,Dummy,SPIF_SENDCHANGE); BringWindowToTop(wnd.hWnd); // IE 5.5 related hack SetForegroundWindow(wnd.hWnd); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT,SPIF_SENDCHANGE); }
代码解释
Making a window the foreground window
requires more than just calling the
SetForegroundWindow API. You must
first determine the foreground thread
and attach it to your window,using
AttachThreadInput,then call
SetForegroundWindow. That way they can
share input states.First I call GetForegroundWindow to
get the handle of the current
foreground window. Then a few calls to
GetWindowThreadProcessId retrieve the
threads associated with the current
foreground window and the window I
want to bring to the foreground. If
these threads are the same a simple
call to SetForegroundWindow is all
that is necessary. Otherwise,the
foreground thread is attached to the
window that I am bringing to the front
and detached from what was the current
foreground window. The
AttachThreadInput API handles this.
解决方法
[DllImport("user32.dll")] static extern bool SetForegroundWindow(IntPtr hWnd); Process[] processes = Process.GetProcessesByName("processname"); SetForegroundWindow(processes[0].MainWindowHandle);
更多信息:http://pinvoke.net/default.aspx/user32.SetForegroundWindow