AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Fremdes Fenster in Vordergrund holen
Thema durchsuchen
Ansicht
Themen-Optionen

Fremdes Fenster in Vordergrund holen

Ein Thema von Sanguis · begonnen am 15. Feb 2007 · letzter Beitrag vom 16. Feb 2007
Antwort Antwort
Sanguis

Registriert seit: 20. Jul 2005
Ort: Essen
146 Beiträge
 
#1

Fremdes Fenster in Vordergrund holen

  Alt 15. Feb 2007, 12:21
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
  Mit Zitat antworten Zitat
Martin99

Registriert seit: 15. Feb 2007
Ort: Witterswil
8 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Fremdes Fenster in Vordergrund holen

  Alt 15. Feb 2007, 16:05
Vorausgesetzt, id ist der Windowhandle:
Versuch es Mal mit

         setWindowPos(strToInt(id), 0, 0, 0, 0, 0, SWP_SHOWWINDOW); Martin
Delphi-Crack
  Mit Zitat antworten Zitat
Prototypjack

Registriert seit: 2. Feb 2003
611 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Fremdes Fenster in Vordergrund holen

  Alt 15. Feb 2007, 16:52
Moin!

Der korrekte Code für dein Vorhaben ist wohl:

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.
Max
„If you have any great suggestions, feel free to mail me, and I'll probably feel free to ignore you.“ . Linus Torvalds
  Mit Zitat antworten Zitat
Sanguis

Registriert seit: 20. Jul 2005
Ort: Essen
146 Beiträge
 
#4

Re: Fremdes Fenster in Vordergrund holen

  Alt 16. Feb 2007, 07:18
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*
  Mit Zitat antworten Zitat
Martin99

Registriert seit: 15. Feb 2007
Ort: Witterswil
8 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Fremdes Fenster in Vordergrund holen

  Alt 16. Feb 2007, 07:48
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
Delphi-Crack
  Mit Zitat antworten Zitat
Sanguis

Registriert seit: 20. Jul 2005
Ort: Essen
146 Beiträge
 
#6

Re: Fremdes Fenster in Vordergrund holen

  Alt 16. Feb 2007, 08:20
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?
  Mit Zitat antworten Zitat
Martin99

Registriert seit: 15. Feb 2007
Ort: Witterswil
8 Beiträge
 
Delphi 2006 Enterprise
 
#7

Re: Fremdes Fenster in Vordergrund holen

  Alt 16. Feb 2007, 08:41
Der WindowHandle ist kein Container, sondern einfach eine Nummer (ein DWord, also ohne Vorzeichen).

Martin
Delphi-Crack
  Mit Zitat antworten Zitat
Sanguis

Registriert seit: 20. Jul 2005
Ort: Essen
146 Beiträge
 
#8

Re: Fremdes Fenster in Vordergrund holen

  Alt 16. Feb 2007, 08:43
Ok.. hab ich wieder was gelernt.

Vielen Dank
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz