ForceForegroundWindow 是一个增强的 SetForeGroundWindow 函数。function ForceForegroundWindow(hwnd: THandle): boolean; const SPI_GETFOREGROUNDLOCKTIMEOUT = $2000; SPI_SETFOREGROUNDLOCKTIMEOUT = $2001; var ForegroundThreadID: DWORD; ThisThreadID : DWORD; timeout : DWORD; begin if IsIconic(hwnd) then ShowWindow(hwnd SW_RESTORE); if GetForegroundWindow = hwnd then Result := true else begin // Windows 98/2000 doesn't want to foreground a window when some other // window has keyboard focus if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and ((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then begin // 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 Result := false; ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow nil); ThisThreadID := GetWindowThreadPRocessId(hwnd nil); if AttachThreadInput(ThisThreadID ForegroundThreadID true) then begin BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hwnd); AttachThreadInput(ThisThreadID ForegroundThreadID false); Result := (GetForegroundWindow = hwnd); end; if not Result then begin // Code by Daniel P. Stasinski SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT 0 @timeout 0); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT 0 TObject(0) SPIF_SENDCHANGE); BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hWnd); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT 0 TObject(timeout) SPIF_SENDCHANGE); end; end else begin BringWindowToTop(hwnd); // IE 5.5 related hack SetForegroundWindow(hwnd); end; Result := (GetForegroundWindow = hwnd); end; end;
SetForegroundWindow(前端窗体.handle),来把窗体置前
SWP_NOACTIVATE + SWP_NOMOVE + SWP_NOSIZE + SWP_SHOWWINDOW);
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
ForegroundThreadID: DWORD;
ThisThreadID : DWORD;
timeout : DWORD;
begin
if IsIconic(hwnd) then ShowWindow(hwnd SW_RESTORE);
if GetForegroundWindow = hwnd then Result := true
else begin
// Windows 98/2000 doesn't want to foreground a window when some other
// window has keyboard focus
if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then
begin
// 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
Result := false;
ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow nil);
ThisThreadID := GetWindowThreadPRocessId(hwnd nil);
if AttachThreadInput(ThisThreadID ForegroundThreadID true) then
begin
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hwnd);
AttachThreadInput(ThisThreadID ForegroundThreadID false);
Result := (GetForegroundWindow = hwnd);
end;
if not Result then begin
// Code by Daniel P. Stasinski
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT 0 @timeout 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT 0 TObject(0) SPIF_SENDCHANGE);
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT 0 TObject(timeout) SPIF_SENDCHANGE);
end;
end
else begin
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hwnd);
end;
Result := (GetForegroundWindow = hwnd);
end;
end;
试试
楼主既然操作主窗体,主窗体自然获得焦点,而处于前置,
如果主窗体是最大化的,那么Form隐藏又如何?要想两个窗体同时完整的呈现在用户面前,那么办法只有一个:
主窗体的位置与Form窗体的位置拉开,使其位置不重合这样在操作主窗体时不仅Form窗体完整可见,而且在主窗体中可以控制Form窗体的各种动作
var f:TForm3 ;
begin
f := TForm3.Create(FormMain);
f.Parent := FormMain;
f.Show;
end;
fsStayOnTop也不行,因为该窗口再showModal别的窗口,别的窗口跑后面去了。
目前只能这样了。用户不小心点了主窗口,这个From.show就跑了,用户不知道是跑到主窗口后面去了,以为丢了。
procedure TForm1.FormActivate(Sender: TObject);
begin
if(Assigned(Form2)and(Form2.Visible)and(Form2.Enabled))then
Form2.BringToFront;
end;