whats new ¦  programming tips ¦  indy articles ¦  intraweb articles ¦  informations ¦  links ¦  interviews
 misc ¦  tutorials ¦  Add&Win Game

Tips (1541)

Database (90)
Files (137)
Forms (107)
Graphic (114)
IDE (21)
Indy (5)
Internet / LAN (130)
IntraWeb (0)
Math (76)
Misc (126)
Multimedia (45)
Objects/
ActiveX (51)

OpenTools API (3)
Printing (35)
Strings (83)
System (266)
VCL (242)

Top15

Tips sort by
component


Search Tip

Add new Tip

Add&Win Game

Advertising

41 Visitors Online


 
...bring (force) a Window to the foreground?
Autor: unknown
Homepage: http://www.eccentrica.org/gabr/gp/files/gx_msdnlookup.htm
[ Print tip ]  

Tip Rating (81):  
     


{
  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;

 

Rate this tip:

poor
very good


Copyright © by SwissDelphiCenter.ch
All trademarks are the sole property of their respective owners