Como forçar o form para aparecer
Olá amigos,
gostaria de saber como fazer para que o form seja força a aparecer por sobre qualquer programa, vou explicar melhor. a minha aplicação vai ficar rodando minimizado e ela tem um timer, ai quando o timer chegar no tempo que eu determinar eu quero que o meu form Apareça independente do programa que esteja rodando, mesmo que seja programas em DOS, JOGOS, por favor isso é urgente pra mim.
Manoel Jailton
mjailton@gmail.com
gostaria de saber como fazer para que o form seja força a aparecer por sobre qualquer programa, vou explicar melhor. a minha aplicação vai ficar rodando minimizado e ela tem um timer, ai quando o timer chegar no tempo que eu determinar eu quero que o meu form Apareça independente do programa que esteja rodando, mesmo que seja programas em DOS, JOGOS, por favor isso é urgente pra mim.
Manoel Jailton
mjailton@gmail.com

Manon
Curtidas 0
Melhor post

Evolte
27/03/2020
Olá amigos,
gostaria de saber como fazer para que o form seja força a aparecer por sobre qualquer programa, vou explicar melhor. a minha aplicação vai ficar rodando minimizado e ela tem um timer, ai quando o timer chegar no tempo que eu determinar eu quero que o meu form Apareça independente do programa que esteja rodando, mesmo que seja programas em DOS, JOGOS, por favor isso é urgente pra mim.
Manoel Jailton
mjailton@gmail.com
gostaria de saber como fazer para que o form seja força a aparecer por sobre qualquer programa, vou explicar melhor. a minha aplicação vai ficar rodando minimizado e ela tem um timer, ai quando o timer chegar no tempo que eu determinar eu quero que o meu form Apareça independente do programa que esteja rodando, mesmo que seja programas em DOS, JOGOS, por favor isso é urgente pra mim.
Manoel Jailton
mjailton@gmail.com
Primeira alternativa
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 }
Segunda alternativa
A função abaixo consegue forçar o foco na janela especificada criando-se um formulário com dimensão de um apenas 1 ponto e simulando um clique de mouse neste formulário para que a aplicação receba o foco de entrada. Em seguida a janela especificada é colocada em primeiro plano usando-se a função SetForegroundWindow da API do Windows.
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;
Terceira alternativa
A biblioteca USER32.DLL possui uma função não documentada que propõe forçar o foco em determinada janela. A declaração da função é:
procedure SwitchToThisWindow(h1: hWnd; x: bool); stdcall;
external user32 Name 'SwitchToThisWindow';
{x = false: Size unchanged, x = true: normal size}
{ Exemplo }
procedure TForm1.Button2Click(Sender: TObject);
begin
SwitchToThisWindow(FindWindow('notepad', nil), True);
end;
Atenção!
Nos testes que fiz usando Windows XP Professional e Delphi 6, a primeira e segunda alternativas funcionaram perfeitamente. A última não funcionou nos testes, mas foi mantida aqui para que outras pessoas possam experimentá-la.
Autor: Desconhecido
GOSTEI 1
Mais Respostas

Aroldo Zanela
24/01/2007
Colega,
Não sei se tem alguma nova função para isso, mas essa aqui funciona:
No Timer:
Não sei se tem alguma nova função para isso, mas essa aqui funciona:
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;
No Timer:
var F: THandle; begin F := Application.Handle; ForceForegroundWindow(F); end;
GOSTEI 0