Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fremdes Fenster in Vordergrund holen (https://www.delphipraxis.net/86536-fremdes-fenster-vordergrund-holen.html)

Sanguis 15. Feb 2007 13:21


Fremdes Fenster in Vordergrund holen
 
Huhu,
ich weiß nicht ob ichs ins richtige Forum packe.. zur Not bitte verschieben.

Also, momentan werkel ich an einem Projekt, das die Shell ersetzt. Zu erklären warum, würde zu lange dauern.
Ich habe also ein Formular, das ich in Vollbild als Desktop hinter alles lege. Soweit passt es auch. Über diese Oberfläche, kann ich verschiedene andere Programme starten.
Problem ist jetzt erstmal, das, wenn ich das Formular anklicke, es sich über die anderen gestarteten Programme setzt.
Das ist soweit aber nicht schlimm, weil ich eh eine art "TaskLeiste" einbauen wollte bzw. schon hab.

Die funktioniert soweit. Es ist eine ToolBar, die per ToolBarButton die geöffneten Programme anzeigt. Generiert wird das dann dynamisch. Jetzt fehlt einzig die Funktion, wie ich die Fenster durch klick auf den ToolbarButton in den Vordergrund bekomme.
Mit folgendem Code fülle ich die "TaskLeiste":

Delphi-Quellcode:
function TaskToBar(t: String; pid: String): string;
var
  TB: TDSToolButton;
  i: integer;
  Event: TNotifyEvent;
begin

    TB := TDSToolButton.Create(form1);
    TB.Parent := form1.Frame21.DSToolBar1;
    TB.Width := 35;      // wirkt sich nicht aus
    TB.Height := 35;     // ???
    //TB.AutoSize := False;
    TB.Caption := IntToStr(i);
    TB.ShowHint := True;
    TB.Hint := pid;
    tb.Caption := t;
    TB.ShowText := true;
    tb.PopupSide := popLeft;
    tb.OnClick := form1.TaskClick;
end;
Die Funktion wird aus einem normalen EnumWindowsProc aufgerufen. "t" ist dabei der Titel der Anwendung:GetText(Wnd)
und pid (so hoffe ich) die ProzessID: IntToStr(Wnd)

Die ProzessID schreibe ich, vorrübergehend, als String in den Hint, damit ich sie übergeben kann. TaskClick sieht so aus:

Delphi-Quellcode:
procedure TForm1.TaskClick(sender : TObject);
var id:String;
fenster: Hwnd;
begin
id := TDSToolButton(sender).Hint;
end;
Die Frage ist jetzt.. wie bekomme ich aus diesem ID String wieder einen WindowHandel, so das ich damit arbeiten kann? Und das möglichst unkompliziert ? Also nicht indem ich nochmal per EnumWindow alles durchgehen muss?

Falls jemand helfen kann, danke ich schonmal im Vorraus. Ich hoffe ich hab gut beschrieben worum es mir geht.

Gruß,
Andreas

Martin99 15. Feb 2007 17:05

Re: Fremdes Fenster in Vordergrund holen
 
Vorausgesetzt, id ist der Windowhandle:
Versuch es Mal mit

Delphi-Quellcode:
         setWindowPos(strToInt(id), 0, 0, 0, 0, 0, SWP_SHOWWINDOW);
Martin

Prototypjack 15. Feb 2007 17:52

Re: Fremdes Fenster in Vordergrund holen
 
Moin!

Der korrekte Code für dein Vorhaben ist wohl:

Delphi-Quellcode:
SetForegroundWindow(HWND);
(HWND ist das Fensterhandle)

Gruß,
Max

Edit:
Die schönste Methode ist es nicht einen Hint als Container zu verwenden, aber wenn es unbedingt sein muss dann speichere gleich das Fensterhandle darin. Ist ja auch nichts anderes als 'ne Nummer.

Sanguis 16. Feb 2007 08:18

Re: Fremdes Fenster in Vordergrund holen
 
Guten Morgen,

also die Version von Martin klappt schon ganz gut, vielen Dank dafür.
Ist ja doch einfacher als ich mir das in meinem Kopf schon ausgemalt hab.
Wenn ich den Firefox in den Vordergrund hole ist er zwar nicht mehr im Vollbild Modus sondern SEHR klein.. aber das kann man per click ändern.. bzw. ändert sich ja vielleicht wenn ich noch mit den Parametern rumspiele *g*

@Max
Deine Version hatte ich gestern stundenlang ausprobiert.
Nur hab ich keine MÖglichkeit gefunden wie ich aus der Zahl (ob nun als Integer oder String) einen Window Handle mache. Und den Handle als Objekt abspeichern hab ich eben nicht hinbekommen weil Hint unbedingt nen String will *g*

Martin99 16. Feb 2007 08:48

Re: Fremdes Fenster in Vordergrund holen
 
Versuche einmal, den Window Handle statt im Hint im Tag zu speichern. Dies ist schon ein Integer, da musst Du keine Typumwandlung mehr machen.

Martin

Sanguis 16. Feb 2007 09:20

Re: Fremdes Fenster in Vordergrund holen
 
Huch.. das funktioniert tatsächlich perfekt.

Aber das wundert mich. Wieso steht überall das im Tag der Typ Integer erforderlich ist? Der WindowHandle ist doch selbst eine Art Container.. und nich nur ein einfacher Integer.. blöde Frage aber.. wieso geht das?

Martin99 16. Feb 2007 09:41

Re: Fremdes Fenster in Vordergrund holen
 
Der WindowHandle ist kein Container, sondern einfach eine Nummer (ein DWord, also ohne Vorzeichen).

Martin

Sanguis 16. Feb 2007 09:43

Re: Fremdes Fenster in Vordergrund holen
 
Ok.. hab ich wieder was gelernt.

Vielen Dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz