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 "Always in Back" (https://www.delphipraxis.net/16813-always-back.html)

Huso 23. Feb 2004 23:34


"Always in Back"
 
Hello Folks!
Ich sitze gerade an einem Programm, das auf dem Desktop liegen (und liegen bleiben) soll...
Gibt es sowas wie "always in back"? Ein timer-gesteuertest "sendtoback" bringt's auch nicht...
Kann mir da jm helfen?

MfG und danke im Voraus
Huso

himitsu 24. Feb 2004 02:05

Re: "Always in Back"
 
[dp]*ontop[/dp]

Das Gegenteil von StayOnTop???

OrallY 24. Feb 2004 13:01

Re: "Always in Back"
 
Mit SetWindowPos kannst du die Position der auf der "Z-Achse" beeinflussen. In deinem Fall also:
Delphi-Quellcode:
SetWindowPos(Handle, HWND_BOTTOM, Left, Top, Width, Height, 0);
Allerdings bleibt das Fenster nur solange im Hintergrund, bis man es wieder nach vorne holt. Ist also keine permanente Einstellung.

Huso 24. Feb 2004 15:23

Re: "Always in Back"
 
Also im Prinzip ist folgender Code genau das, was ich brauche, funktioniert bei mir allerdings nicht... :wall:
Delphi-Quellcode:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  if Assigned(Application.MainForm) then
  begin
    Params.WndParent := GetDesktopWindow;
    Params.Style := WS_CHILD;
  end;
end;
eigentlich ändert sich nichts: Ein aktives Fenster liegt vor dem Programm, doch sobald ich wieder in meine Form klicke ist diese wieder im Fordergrund... :kotz:
Ist es vll eine Idee, dass sobald mein Fenster aktiv wird ich es wieder in den Hintergrund schicke?! :drunken:
Wie könnte ich das verwirklichen?
MfG Huso

Huso 26. Feb 2004 16:28

Re: "Always in Back"
 
Bitte helft mir :coder:
:wall: Ich komm da nun wirklich nicht weiter, wenn mir niemand hilft! :wiejetzt:
Wenn jm auch nur die geringste Idee hat :warn: bitte posten!!!

THX :firejump:

MfG Huso

PhöniX 26. Feb 2004 16:32

Re: "Always in Back"
 
ne komplizierte methode wär vielleicht:

in jede procedure dies da gibt schreiben, dass die form "in back" sein soll...
den code weiß ich grad nicht...

Huso 29. Feb 2004 13:20

Re: "Always in Back"
 
Also eigentlich müsste das doch theoretisch möglich sein den Desktop als Parent und mein Program als entsprechendes Child zu benutzen, oder? Das hätte doch den gewünschten Effekt?!
Aber was ist dann oben falsch? :gruebel:

MfG HusO

nemo2003 29. Feb 2004 13:25

Re: "Always in Back"
 
einen schönen sonntag nachmittag!

aus www.pics-software.de gibt es eine sog. "Delphi-(P)fundgrube" ;o) wo diverse Tips gegeben werden.
Da steht auch wie ein Programm ohne Taskmanager und auch ohne Tray-Hinweis amlaufen bleibt!

Schönen Sonntag noch!

SirThornberry 29. Feb 2004 13:29

Re: "Always in Back"
 
änder einfach mal von
Delphi-Quellcode:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  if Assigned(Application.MainForm) then
  begin
    Params.WndParent := GetDesktopWindow;
    Params.Style := WS_CHILD;
  end;
end;
nach
Delphi-Quellcode:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := GetDesktopWindow;
  Params.Style := WS_CHILD;
end;
Bei mir ist in "CreateParams", "if Assigned(Application.MainForm)" immer false. Nach dem ich die Bedingung raus genommen hab hats funktioniert

Huso 29. Feb 2004 13:47

Re: "Always in Back"
 
THX
Jo, jetzt geht's vielen dank!

MfG Huso

Huso 29. Mär 2004 22:42

Re: "Always in Back"
 
Tja, da bin ich nochmal...
Also mein Problem ist, dass ich mit der obigen Variante keine weiteren Formulare aus meinem Programm öffnen kann und es fängt an zu hängen, sobald man einen button klickt.

Hat jm einen besseren Vorschlag??

Falls ja postet eure Ideen bitte! :coder:
Das ist nämlich eine Facharbeit und die muss ich in den nächsten Tagen vorstellen...
Also bitte ich euch darum vielleicht mal etwas über mein Problem nachzudenken :gruebel:

THX, für alles -- Delphi-Praxis RULEZ :dp:

MfG Huso

Ghostwalker 30. Mär 2004 08:20

Re: "Always in Back"
 
Ähm...mal ne Frage....welchen sinn hat das Fenster wenns eh dauernd im Hintergrund sein soll und der Benutzer mit anderen Fenstern im Vordergrund arbeitet ?

Wärs da nicht evtl. sinniger einfach ein Tray-Icon zu verwenden ??

Huso 30. Mär 2004 15:39

Re: "Always in Back"
 
Also der Sinn des Progs ist es den Desktop zu ersetzen. Es werden aus meinem Programm heraus Anwendungen geöffnet... Es dient den Schülern Selbsterklärend den Rechner zur Verfügung zustellen...
Vei weitern Fragen bitte Posten...

MfG Huso

atreju2oo0 30. Mär 2004 16:27

Re: "Always in Back"
 
Immer wenn dein Programm den Focus gekommt müsstest Du einfach den Focus weiterschieben auf das letzte Fenster;
1) Also immer überwachen wer gerade aktiv ist;
2) Als Handle merken;
3) Bei Form.show oder so den Focus auf das gespeicherte Handle setzen...

Zumindest würde ich es so versuchen...
Bin aber (wie schon oft hier gemerkt :pale: ) auch nicht der Vollblutprofi!

Mithotyn 12. Apr 2004 22:51

Re: "Always in Back"
 
Hi Leute.

Hab auch noch ein kleines Problem mit dem Code.
Also mein Fenster ist nun immer im Hintergrund. Soweit so gut.
Jetzt hab ich aber einen zusätzlichen Eintrag in der Taskbar. Einmal den
der Application und den neuen nun direkt für Form1.

Die Application konnte ich mit

Delphi-Quellcode:
ShowWindow(Application.Handle, SW_HIDE);
ausblenden, aber wie bekomme ich den Eintrag der Form weg ?

Gruß Joachim

Aike 21. Mai 2005 10:30

Re: "Always in Back"
 
Mir gefällt die Lösung von p.i.c.s.:
Delphi-Quellcode:
SetWindowPos(Handle, HWND_NOTOPMOST,Left,Top,Width,Height,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

thomasdrewermann 23. Sep 2005 21:12

Re: "Always in Back"
 
Hilft das auch bei nicht laufener Shell Explorer.exe wiel dann kein Desktop-Fenster vorhanden ist...

MFG
Thomas

Tisse 9. Feb 2006 12:25

Re: "Always in Back"
 
Hallo ich hätte vielleicht noch eine andere Lösung für das Problem.

Delphi-Quellcode:
procedure TForm1.JvAppEvents1Activate(Sender: TObject);
begin
  Form1.SendToBack;
end;
Wenn ich den Code in das "OnActivte" Ereigniss meiner "Form1" schreibe funktioniert das bei mir nicht :?: , wenn ich es über die "JvAppEvents" Komponente mache bleibt mein Fenster immer im Hintergrund, das vorher aktiv gewesene Fenster veliert dabei den Fokus.

DGL-luke 9. Feb 2006 21:23

Re: "Always in Back"
 
@thomasdrewermann: Wenn du die Explorer.exe schon komplett abschießt - warum dann nicht gleich eine eigene Shell bauen?

Ich weiss ja nicht, inwiefern noch die Startleiste benötigt wird - aber wenn nicht, dann kann man einfach ein Konto auf dem PC einrichten, in dem man die shell, sprich die explorer.exe, ersetzt. das ganze muss man windows dann noch in der registry mitteilen, es gibt auch ein paar sachen, die man beachten muss.

Inwieweit man das dann als Desktopfenster deklarieren kann, weiss ich aber nicht, oder ob das Desktopfenster noch unter explorer.exe liegt.

Logic 16. Apr 2006 12:38

Re: "Always in Back"
 
Hallo!

Ich beziehe mich auf den Anfang vom Thread, also das Grundproblem :)

Delphi-Quellcode:
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.WndParent := GetDesktopWindow;
  Params.Style := WS_CHILD;
end;
Ich weiß nicht so recht wo ich die Procedure TForm1.CreateParams einbinden muss? Könnte mir vll. jemand da auf die Sprünge helfen?

mfg
Th

Lasse2002 16. Apr 2006 13:48

Re: "Always in Back"
 
Diese Funktion wird automatisch von Delphi aufgerufen. Damit das allerdings dann auch tatsächlich passiert, mußt du sie als override deklarieren.

Delphi-Quellcode:
type
  TForm1 = class(TForm)
   // [...]
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

Logic 16. Apr 2006 15:02

Re: "Always in Back"
 
Du sorry bei mir klappt das nicht, wenn ich es hier hin mache:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    XPManifest1: TXPManifest;
    RadioButton1: TRadioButton;
    protected
    procedure CreateParams(var Params: TCreateParams); override;
    end;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
kommt die Fehlermeldung:
Zitat:

[Error] Unit1.pas(20): '=' expected but identifier 'public' found
[Error] Unit1.pas(22): ';' expected but 'END' found
[Error] Unit1.pas(27): '.' expected but 'IMPLEMENTATION' found
[Error] Unit1.pas(16): Unsatisfied forward or external declaration: 'TForm1.CreateParams'
[...]
und wenn ich es hier hin mache:
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    XPManifest1: TXPManifest;
    RadioButton1: TRadioButton;

  private
    { Private declarations }
  public
    { Public declarations }
  protected
  procedure CreateParams(var Params: TCreateParams); override;
  end;
  end;
kommt die:
Zitat:

[Error] Unit1.pas(23): 'IMPLEMENTATION' expected but ';' found
[Error] Unit1.pas(28): '.' expected but 'IMPLEMENTATION' found
[...]

fkerber 16. Apr 2006 15:05

Re: "Always in Back"
 
Hi!

Wenn ich das richtig sehe, hast du da das "end;" nach dem Funktionskopf zu viel.


Ciao Frederic

Logic 17. Apr 2006 01:09

Re: "Always in Back"
 
Hey danke, hat funktioniert... nur das Problem ist, dass mit dem Code das Form immer im Vordergrund bleibt mhh und ich will doch eigentlich genau das Gegenteil...

Logic 23. Apr 2006 13:09

Re: "Always in Back"
 
hat jemand ne Idee?

FarAndBeyond 6. Sep 2015 02:46

AW: "Always in Back"
 
Falls hier nochmal jemand landet und zum gleichen Thema 'ne Lösung braucht:

Das macht man ohne Params und ohne Timer einfach so:
Delphi-Quellcode:
Privat
Procedure WindowPosChanging(Var MSG: TWMWindowPosMsg); Message WM_WINDOWPOSCHANGING;

Procedure TForm1.WindowPosChanging(Var MSG: TWMWindowPosMsg);
 Begin
  If MSG.WindowPos.Flags And SWP_NOZORDER = 0
  Then MSG.WindowPos.HWNDInsertAfter := HWND_BOTTOM;
  Inherited;
 End;
Dann bleibt das Ding hinten auch wenn man auf die Form klickt...
(in D7 gehts ausgezeichnet)

Nur weil das Thema alt ist heißt das nicht, dass es von Google oder der internen Suche nicht mehr gefunden wird...
Daniel kann es ja wieder in die Versenkung kicken...
Information ist wichtiger als Herumgezicke... nur um das mal gleich vorneweg zu nehmen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:07 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