![]() |
"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 |
Re: "Always in Back"
|
Re: "Always in Back"
Mit SetWindowPos kannst du die Position der auf der "Z-Achse" beeinflussen. In deinem Fall also:
Delphi-Quellcode:
Allerdings bleibt das Fenster nur solange im Hintergrund, bis man es wieder nach vorne holt. Ist also keine permanente Einstellung.
SetWindowPos(Handle, HWND_BOTTOM, Left, Top, Width, Height, 0);
|
Re: "Always in Back"
Also im Prinzip ist folgender Code genau das, was ich brauche, funktioniert bei mir allerdings nicht... :wall:
Delphi-Quellcode:
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:
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; 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 |
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 |
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... |
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 |
Re: "Always in Back"
einen schönen sonntag nachmittag!
aus ![]() Da steht auch wie ein Programm ohne Taskmanager und auch ohne Tray-Hinweis amlaufen bleibt! Schönen Sonntag noch! |
Re: "Always in Back"
änder einfach mal von
Delphi-Quellcode:
nach
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;
Delphi-Quellcode:
Bei mir ist in "CreateParams", "if Assigned(Application.MainForm)" immer false. Nach dem ich die Bedingung raus genommen hab hats funktioniert
procedure TForm1.CreateParams(var Params: TCreateParams);
begin inherited CreateParams(Params); Params.WndParent := GetDesktopWindow; Params.Style := WS_CHILD; end; |
Re: "Always in Back"
THX
Jo, jetzt geht's vielen dank! MfG Huso |
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 |
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 ?? |
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 |
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! |
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:
ausblenden, aber wie bekomme ich den Eintrag der Form weg ?
ShowWindow(Application.Handle, SW_HIDE);
Gruß Joachim |
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);
|
Re: "Always in Back"
Hilft das auch bei nicht laufener Shell Explorer.exe wiel dann kein Desktop-Fenster vorhanden ist...
MFG Thomas |
Re: "Always in Back"
Hallo ich hätte vielleicht noch eine andere Lösung für das Problem.
Delphi-Quellcode:
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.
procedure TForm1.JvAppEvents1Activate(Sender: TObject);
begin Form1.SendToBack; end; |
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. |
Re: "Always in Back"
Hallo!
Ich beziehe mich auf den Anfang vom Thread, also das Grundproblem :)
Delphi-Quellcode:
Ich weiß nicht so recht wo ich die Procedure TForm1.CreateParams einbinden muss? Könnte mir vll. jemand da auf die Sprünge helfen?
procedure TForm1.CreateParams(var Params: TCreateParams);
begin inherited CreateParams(Params); Params.WndParent := GetDesktopWindow; Params.Style := WS_CHILD; end; mfg Th |
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; |
Re: "Always in Back"
Du sorry bei mir klappt das nicht, wenn ich es hier hin mache:
Delphi-Quellcode:
kommt die Fehlermeldung:
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; Zitat:
Delphi-Quellcode:
kommt die:
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; Zitat:
|
Re: "Always in Back"
Hi!
Wenn ich das richtig sehe, hast du da das "end;" nach dem Funktionskopf zu viel. Ciao Frederic |
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...
|
Re: "Always in Back"
hat jemand ne Idee?
|
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:
Dann bleibt das Ding hinten auch wenn man auf die Form klickt...
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; (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 21:14 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