bring
(force) a Window to the foreground
Author:
unknown
Homepage:
http://www.eccentrica.org/gabr/gp/files/gx_msdnlookup.htm
0 Comments
to this tip [Write new comment]
[ Print tip
]
Tip Rating
(32):
Skill:
Useful:
Overall:
{
Windows 98/2000 doesn't want to foreground a
window when
some other window has the keyboard focus.
ForceForegroundWindow is an enhanced
SetForeGroundWindow/bringtofront
function to bring a window to the front.
}
{
Manchmal funktioniert die
SetForeGroundWindow Funktion
nicht so, wie sie sollte; besonders unter
Windows 98/2000,
wenn ein anderes Fenster den Fokus hat.
ForceForegroundWindow ist eine
"verbesserte" Version von
der SetForeGroundWindow API-Funktion, um ein
Fenster in
den Vordergrund zu bringen.
}
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; {
ForceForegroundWindow }
// 2. Way:
//**********************************************
procedure
ForceForegroundWindow(hwnd: THandle);
// (W) 2001 Daniel Rolf
//
http://www.finecode.de
// rolf@finecode.de
var
hlp: TForm;
begin
hlp := TForm.Create(nil);
try
hlp.BorderStyle := bsNone;
hlp.SetBounds(0, 0, 1, 1);
hlp.FormStyle := fsStayOnTop;
hlp.Show;
mouse_event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
SetForegroundWindow(hwnd);
finally
hlp.Free;
end;
end;
// 3. Way:
//**********************************************
// by
Thomas Stutz
{
As far as you know the SetForegroundWindow
function on Windows 98/2000 can
not force a window to the foreground while
the user is working with another window.
Instead, SetForegroundWindow will activate
the window and call the FlashWindowEx
function to notify the user. However in some
kind of applications it is necessary
to make another window active and put the
thread that created this window into the
foreground and of course, you can do it
using one more undocumented function from
the USER32.DLL.
void SwitchToThisWindow (HWND hWnd, // Handle to the window that should be
activated
BOOL bRestore // Restore the window if it is
minimized
);
}
procedure
SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
external user32 Name 'SwitchToThisWindow';
{x = false: Size unchanged, x = true:
normal size}
procedure
TForm1.Button2Click(Sender: TObject);
begin
SwitchToThisWindow(FindWindow('notepad',
nil), True);
end;