Tech-Ecke / Delphi Inhalt / Fremde Anwendung in den Vordergrund bringen

 

     Fremde Anwendung maximieren, minimiert und wiederherstellen

 

Möchte man eine fremde Anwendung in den Vordergrund bringen, so lässt sich dies wie folgt bewerkstelligen.
Zunächst benötigt man den Handle der Anwendung. Diesen bekommt man beispielsweise über den Anwendungsnamen (nicht zwangsläufig gleich mir dem EXE-Dateinamen). Um gezielter auswählen zu können, kann man auch noch den Fenstertitel mit heranziehen. Im Beispiel wird die minimierte Anwendung Notepad aus der Versenke geholt (wiederhergestellt), da hier das gerade geöffnete Dokument als Fenstertitel herangezogen wird, solle man auf die Angabe verzichten und stattdessen nil einsetzen.  
 

  var
       wnd:
HWND;
.
.

wnd := FindWind('Notepad',nil);
SendMessage(wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(wnd)  // um letztlich das Fenster auch aktiv zu setzen. Siehe auch SetForegroundWindowEx weiter unten

 

Maximieren:  SC_MAXIMIZE
Minimieren:   SC_MINIMIZE


 

   Anwendung in den Vordergrund bringen mit SetForegroundWindowEx :

ab Windows Me (98?) wird SetForegroundWindow das Fenster leider nicht mehr in den Vordergrund bringen, solange der Focus auf einer anderen Anwendung liegt. Stattdessen beginnt die Anwendung in der Taskleiste an orange zu blinken. Mit SetForegroundWindowEx wird die Anwendung jedoch trotzdem in den Vordergrund katapultiert.

  procedure SetForegroundWindowEx(Wnd: HWND);
var
      Attached: Boolean;
      ThreadId: DWORD;
      FgWindow: HWND;
      AttachTo: DWORD;
begin                   
   Attached := False;
   ThreadId := GetCurrentThreadId;
   FgWindow := GetForegroundWindow();
   AttachTo := GetWindowThreadProcessId(FgWindow, nil);
   if (AttachTo <> 0) and (AttachTo <> ThreadId) then
   if AttachThreadInput(ThreadId, AttachTo, True) then
      begin
        Attached := Windows.SetFocus(Wnd) <> 0;
        AttachThreadInput(ThreadId, AttachTo, False);
      end;
   if not Attached then
      begin
         SetForegroundWindow(Wnd);
         SetFocus(Wnd);
      end;
end;   // von setforegroundWindowEx

Quelle: http://www.delphipraxis.net

Aufgerufen wird das ganze mit:

   SetForegroundWindowEx(wnd);

Wobei 'wnd' der Handle der Anwendung ist, die in den Vordergrund gebracht werden soll. Eine Möglichkeit ist den Handel über den Anwendungsnamen und dem Fenstertitel zu bekommen, mittels 'FindWindow'. Möchte man als Beispiel Windows Notepad in den Vordergrund zaubern, so könnte das wie folgt aussehen:

   SetForegroundWindowEx(FindWindow('Notepad',nil));

Mehr zu Windows Handle gibt es hier.

 

"Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !"

[letzte Aktualisierung 24.01.2009]