Вывести окно на передний план

{codecitation class=»brush: pascal; gutter: false;» width=»600px»}

Оформил: DeeCo

Автор: http://www.swissdelphicenter.ch

{

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;

{/codecitation}

Добавить комментарий