![]() |
Fenster nicht minimieren
Hallo zusammen,
ich habe die ganze Zeit auf alle meine Fragen Antworten über die DP Suche gefunden, doch nun finde ich einfach keine Lösung für folgendes Problem: Ich möchte ein Fenter (nicht Mainform) auf dem Desktop liegen haben welches nicht minimiert werden kann, auch nicht über das Desktop Icon in der Taskleite, und genau da liegt das Problem. Ich kann die Message WM_Syscommand mit SC_Minimieze abfangen und bearbeiten, nur funktioniert das nicht mit dem Desktop Icon. Windows sendet scheinbat hier eine andere Message die ich nicht kenne. Vielleicht kennt jemand die Lösung oder hat hierfür ein Codeschnipsel für mich. Gruß Optiplex |
Re: Fenster nicht minimieren
was verstehst du unter "desktop icon"? :gruebel: ich habe über die verknüpfung auf dem desktop noch nie eine anwendung minimieren können! meinst du etwa das symbol in der tastleiste, auf das du einen rechtsklick machen und "minimieren" auswählen kannst?
|
Re: Fenster nicht minimieren
Ich denke er meint das "Desktop anzeigen"
|
Re: Fenster nicht minimieren
Zitat:
|
Re: Fenster nicht minimieren
hallo
Zitat:
wie kann man eine Form als Deskband registieren bzw wie funktioniert denn das, habe davon noch nichts gehört. Optiplex |
Re: Fenster nicht minimieren
Ich glaube es wird WM_SYSCOMMAND mit dem Parameter SC_MINIMIZE gesendet.
|
Re: Fenster nicht minimieren
hallo Tyrael Y.
Zitat:
Gruss Optiplex |
Re: Fenster nicht minimieren
Mal sorum gefragt: Kennst Du eine Applikation, die das "Desktop anzeigen" ignoriert?
Edith: Hui verdammt, hab tatsächlich eine gefunden...die DesktopWidgetEngine macht das... Oh! Sherlock |
Re: Fenster nicht minimieren
Gibt es überhaupt einen sinnvollen Grund, warum man das verhindern sollte? Dafür ist die Funktion ja da.
|
Re: Fenster nicht minimieren
Ups sry deinen Anfangspost wohl etwas überlesen.
WM_SIZE könnte es auch sein mit SIZEICONIC bzw. SIZE_MINIMIZED |
Re: Fenster nicht minimieren
Zitat:
egal in welcher Form auf dem Desktop liegen haben, und dieses soll dann natürlich nicht einfach minimiert werden können. Optiplex |
Re: Fenster nicht minimieren
Zitat:
Btw bezweifle ich, dass Deskbands eine Lösung für dich sind. Du kannst nämlich nur festlegen, ob es unten, oben, rechts oder links ist, und es geht dann immer über die komplette Breite/Höhe. Außerdem wird es *immer* angezeigt, andere Anwendungen können nicht in den Bereich des Deskbands verschoben oder maximiert werden. Aber es dürfte denke ich die einzige Lösung sein, die zuverlässig sicherstellt, dass dein Zeug auch nach "Desktio anzeigen" noch angezeigt wird. |
Re: Fenster nicht minimieren
Um noch mehr zur Verwirrung beizutragen: Drück mal [Windows]+M ;)
Win+M minimiert alle Fenster. Win+D (bzw. "Desktop anzeigen") Holt den Desktop in den Vordergund. Ein nicht zu vernachlässigender Unterschied ;) (Da du ja bereits das Minimieren verhinderst, nehme ich mal an, dass dir dies bei Win+M gelingt ?) Du könntest jetzt natürlich die Message-Loop von dem Progman Fenster subclassen und die DTM_RAISE message (WM_USER + 83) abfangen. Empfehlenswert ist das jedoch nicht (allg. das Verhalten sich nicht minimieren zu lassen.) Quellen: ![]() und ![]() |
Re: Fenster nicht minimieren
Zitat:
Zitat:
jfheins, die Links muss ich mir noch ansehen, ich gebe dir noch Bescheid ob sie mir weiterhelfen. Danke für die Antworten Optiplex |
Re: Fenster nicht minimieren
Soll das Fenster dann niemals minimiert werden oder einfach nur dieses Desktop Anzeigen trotzen? Ansonsten könntest du doch prüfen ob das Fenster minimiert wurde und es wieder aufrufen.
|
Re: Fenster nicht minimieren
Zitat:
ich will nicht das allg. Verhalten von Windows ändern, ich möchte nur, dass mein kleines Fenster sichtbar bleibt und diese "ToggleDesktop" Nachricht ignoriert. Zitat:
Gruss Optiplex |
Re: Fenster nicht minimieren
Okay, also nochmal :mrgreen:
1. Würde es immernoch nicht mögen. Persönliche Meinung ;) 2. Was passiert wenn du statt "Desktop anzeigen" mal Win+M drückst? 3. Um es abzufangen, wenn der Desktop in den Vordergung geholt wird (nicht dasselbe wie alle Minimieren) könntest du versuchen, dich in die Nachrichtenschleife vom Desktop ("Progman") einzuhängen und auf die DTM_RAISE Nachricht zu reagieren. (bspw. mit einem Postmessage an deine anwendung, die sich dann beim verarbeiten dieser message in den vordergrund holt) |
Re: Fenster nicht minimieren
Zitat:
|
Re: Fenster nicht minimieren
Zitat:
Win+M bekommt man mit WM_Syscommand in den Griff. Wie hängt man sich in die Nachrichtenschleife von "Progman" ein, da bin ich mit meinem Wissen an eine Grenze gestoßen :oops:, vielleicht kann du mir da ein bischen Nachhilfe geben. Auf jeden Fall habt ihr mich dahingehend überzeugt, dass ich diese Funktion (falls es gelingt sie zu realisieren) in die Options aufnehmen werde, so dass jeder User selbst bestimmen kann ob er dieses Fenster auf dem Desktop liegen hat oder nicht. Zitat:
Optiplex |
Re: Fenster nicht minimieren
So ungefähr:
Delphi-Quellcode:
Das Handle bekommst du über FindWindow ;)
var
OldWndProc: Pointer; begin // Change WndProc OldWndProc := SetWindowLong({Handle}, GWLP_WNDPROC, @NewWndProc); end; function NewWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; begin if ({Message}) // Handle Message else // Call old WndProc CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam); end; |
Re: Fenster nicht minimieren
OK jfheins,
dass es so schwierig wird, habe ich mir am Anfang nicht vorgestellt. Werde am Wochenende mich mit deinem Code mal ausführlich auseinandersetzen. Melde mich spätestens am Montag wieder bei dir, hoffentlich mit einem positiven Ergebnis. Falls jemand noch eine andere Idee hat, ich bin für jeden Einfall dankbar. Gruss Optiplex |
Re: Fenster nicht minimieren
Hallo jfheins,
mir ist es nicht gelungen diese Message mit deinem Code abzufangen, irgendwie steht ich da auf dem Schlauch. Ich gehe davon aus, dass begin // Change WndProc OldWndProc := SetWindowLong({Handle}, GWLP_WNDPROC, @NewWndProc); end; in der Create des Formulars steht und function NewWndProc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; begin if ({Message}) // Handle Message else // Call old WndProc CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam); end; als eigenständige Funktion im Implementation teil ist. So und nun habe ich das Problem die Message genau zu deklarieren und abzufangen, vielleicht kannst du mir da nochmal helfen Danke und Gruss Optiplex |
Re: Fenster nicht minimieren
Liste der Anhänge anzeigen (Anzahl: 2)
Hi,
schau doch mal hier ![]() cu Oliver [edit]hmmm, irgendwie doch nicht ... ich habe da ein kleines projekt realisiert, das immer im vordergrund bleibt und sich auch nicht von diesem minimieren beeindrucken lässt, ich schau nochmal nach, warum das so reagiert[/edit] [edit2]so ich habe jetzt mal mein kleines DemoProjekt hier platziert, das angezeigte Fenster ist durchklickbar, always OnTop (auch bei Bildschirmschoner, TaskManager) und lässt sich auch nicht minimieren[/edit2] [edit3]für alle die es interessiert, dieses benötige ich für ein Netzwerk-Überwachungs-Proggie, das die Netzwerkverbindung von Filialen zur Zentrale überwacht, und bei entsprechenden Störungen an allen Arbeitsplätzen diese Hinweise einblendet. Damit kann das Telefonaufkommen in der Zentrale entscheidend verringert werden (die Betonung liegt aber hier auf "kann") :mrgreen: [/edit3] |
Re: Fenster nicht minimieren
Hallo Oliver,
danke für das Beispiel, aber leider kann man dieses Fenster micht mehr mit der Maus ansprechen, ich gehe davon aus, dass dies von der Transparentz kommt, diese schein mir auch dafür verantwortlich zu sein, dass der 'Button Desktop' anzeigen in der Taskbar das Fenster nicht erreicht. Die Lösung ist soweit gut, nur müsste mein Fenster Mausklicks registrieren. Hast du dafür auch eine Lösung perat. Dieter |
Re: Fenster nicht minimieren
Zitat:
Zitat:
Delphi-Quellcode:
und dann prüfen
const DTM_RAISE = WM_USER + 83;
Delphi-Quellcode:
Wenns nicht geht: wird die Funktion überhaupt aufgerufen? (Breakpoint rein und Desktop anzeigen)
if (uMsg = DTM_Raise)
// Handle Message else // Call old WndProc CallWindowProc(OldWndProc, hWnd, uMsg, wParam, lParam); end; Kann aber auch sein, dass es ne sackgasse ist ... :angel2: |
Re: Fenster nicht minimieren
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Dieter,
Zitat:
Ich lade aber nochmal eine überarbeitete Version hoch, da kann man dann über das PopUp die "Durchklickbarkeit" ein- und ausschalten. cu Oliver |
Re: Fenster nicht minimieren
hallo jfheins,
habe esst gestern Abend ausprobiert, bin aber bei @NewWndProc in FormCreate hängen geblieben ich bekam den Fehler [Fehler] E2036 Variable erforderlich,. Weist du welche Variable gemeint ist und wie und wo ich diese deklarieren muss? Ich habe auch probiert die NewWndProc eingenständig ohne sie im Private teil anzugeben, hier bekomme ich noch den Fehler, dass die Typen Pointer und Integer nicht kombatibel sind. Kann dir deshalb nicht sagen ob die function überhaupt aufgerufen wird. const DTM_Raise=WM_User+83; type TForm2 = class(TForm) private function NewWndProc(hWnd:HWND;uMsg:Uint;wparam:WParam;lPara m:LPARAM):Lresult; end; var Form2: TForm2; OldwndProc:Pointer; implementation procedure TForm2.FormCreate(Sender: TObject); begin OldwndProc:=Setwindowlong(self.Handle,GWL_WNDPROC, @NewWndProc); end; function TForm2.NewWndProc(hWnd:HWND;uMsg:Uint;wparam:WPara m;lParam:LPARAM):Lresult; begin if (uMsg=DTM_RAISE) then begin sleep(3000); end else CallwindowProc(Oldwndproc,hwnd,umsg,wparam,lparam) ; end; Hallo Oliver, wenn die Transparent nicht am diesem Verhalten schuld ist, was bewirkt dann, dass dein Fenster für Win+D bzw Win+M tasten scheinbar unempfindlich ist, erklärs mir bitte. Ich kann nämlich keine besonderen Messageaufrufe in deinem Code erkennen, er funktioniert aber. gruss Dieter Gruss Optiplex |
Re: Fenster nicht minimieren
1. sein code verwendent, soweit ich das sehe, einen Timer der das Formular immer wieder in den vordergrund holt (topmost)
2. Zu meiner alternative: :arrow: newwndproc darf keine methode des forms sein :arrow: Das handle musst du ermitteln, und nicht dein eigenes nehemn !! :arrow: mach dir statt dem sleep erstmal nen breakpoint rein ;)
Delphi-Quellcode:
Mit den Delphi-Tags wird dein code übrigens wesentlich besser lesbar ;)handle = FindWindow("Progman", "Program Manager"); Oldwndproc = Setwindowlong(handle, GWL_WNDPROC, NewWndProc); :arrow: Pointer und Integer kannst du casten Wenn ich Delphi hätte, könnte ich das Beispiel überprüfen, aber das ist alles aus dem Kopf im Browser geschrieben ;) |
Re: Fenster nicht minimieren
Zitat:
Zitat:
1. MainForm.Hide 2. SubForm.FormStyle := fsStayOnTop In der Kombination wird die SubForm nicht minimiert. cu Oliver |
Re: Fenster nicht minimieren
Zitat:
Zitat:
Dieter |
Re: Fenster nicht minimieren
Zitat:
Solange wie die oben genannten Bedingungen erfüllt sind, dann ist das so und ändert sich auch nicht ... ich konnte bisher das SubForm nicht minimieren ... ausser durch das Minimieren-Symbol des Forms selber. cu Oliver |
Re: Fenster nicht minimieren
Hallo zusammen!
Ich kenne mich jetzt in der Delphi-Programmierung nicht so aus, aber vielleicht kann ich so einen anderen Ansatz beisteuern: Ich habe mal als Diensleister für ein Unternehmen mit hunderten Filialen deutschlandweit gearbeitet. Die unternehmensweite Software wurde auf den Kassen-PCs aller Filialen installiert. Eine einheitliche Domäne gab es nicht. Benutzer durften ausschließlich diese eine Unternehmenssoftware verwenden. Wir haben das so gelöst: In der Registry unter "Hkey_Local_Machine\Software\Microsoft\ Windows NT\CurrentVersion\Winlogon" gibt es einen Wert "Shell". Dieser Wert enthält gewöhnlich die Explorer.exe Wir haben die Explorer.exe gegen die Start-Datei der Anwendung ausgetauscht, haben die Benutzer-Rechte so angepasst, dass der Explorer auch nicht über den Taskmanager gestartet werden konnte. Nach diesem Prinzip funktionieren u.a. auch einige Automaten für die Zimmerbuchung mancher Hotels. Aber auch andere Anwendungen sind im Einsatz. Meiner Erfahrung nach ist es sehr schwer via Anwendung den Zugriff auch den Desktop oder andere Anwendungen zu verweigern, solange Windows dies zulässt. Eine Anwendung kann man auch beenden. Gruß Jurai |
Re: Fenster nicht minimieren
@Jurai: Ist schon interessant, aber in diesem Kontext irgendwie OT
|
Re: Fenster nicht minimieren
Hallo Julius,
Ich habe den Code nach deinen Vorgaben verändert, aber leider bekomme ich immer noch 2 Fehlermeldungen beide in der selben Zeile. E2003 Undefinierter Bezeichner: 'NewWndProc' E2010 Inkompatible Typen: 'Pointer' und 'Integer' er kennt nicht NewWndProc egal ob mit oder ohne @ ich habe auch probiert mit Cardinal( @ NewWndProc) irgendwie scheint hier noch was zu fehlen
Delphi-Quellcode:
Hallo Oliver,
const DTM_Raise=WM_User+83;
type TForm2 = class(TForm) end; var Form2: TForm2; OldwndProc:Pointer; progmanhandle:Thandle; implementation procedure TForm2.FormCreate(Sender: TObject); begin progmanhandle:=findwindow('Progman','Program Manager'); OldwndProc:=Setwindowlong(progmanhandle,GWL_WNDPROC,@NewWndProc); end; function NewWndProc(hWnd:HWND;uMsg:Uint;wparam:WParam;lParam:LPARAM):Lresult; begin if (uMsg=DTM_RAISE) then begin // sleep(3000); end else CallwindowProc(Oldwndproc,hwnd,umsg,wparam,lparam); end; es ist auf jeden Fall sehr nützlich zu wissen durch welche Vorgaben man dieses Verhalten des Fensters erreichen kann, nur das Fenster steht dann ständig im Vordergrund, das ist für den Einsatzbereich für den du das Programm geschrieben hast OK. Für mein Programm kann ich das leider nicht gebrauchen. Ich habe gesehen, dass du im Menu den Punkt Immer im Vordergrund hast, deshalb war ich der Meinung dass man das Topmost ein und ausschalten kann, doch beim durchtesten konnte ich das Fenster nicht in den Hintergrund bekommen. Vielleicht können wir mit dem Ansatz von Oliver und der Erkenntnis, dass das Fenster in den Vordergrund gebracht werden muss, das Verhalten des Fensters so manipulieren, dass es nicht ständig OnTop ist. Das könnte ich mir auch im deinem Programm vorstellen. Hallo Jurai, dein Ansatz das Problem zu lösen ist weit überzogen, da wir niemanden in seine rechten beschränken wollen sondern nur das Verhalten eines Fensters ändern. Gruss Dieter |
Re: Fenster nicht minimieren
Hi Optiplex,
ich denke wir sind hier auf dem falschen Weg ... oder wie der Engländer so gerne sagt: "heavy on the woodway". Das Fenster wird gar nicht minimiert, sondern der Desktop wandert nach oben und verdeckt somit die nun darunterliegenden Fenster. Darum bekommst du auch keine entsprechende Msg gesendet. Darum funktioniert auch mein Ansatz mit StayOnTop. Somit müsste also überprüft werden, ob das Fenster immer noch über dem Desktop liegt. Das müsste der richtige Ansatz sein. cu Oliver |
Re: Fenster nicht minimieren
Hi Oliver,
es ist genau richtig was du meinst, deshalb schrieb ich ja schon Vielleicht können wir mit dem Ansatz von Julius und der Erkenntnis, dass das Fenster in den Vordergrund gebracht werden muss, das Verhalten des Fensters so manipulieren, dass es nicht ständig OnTop ist. Das könnte ich mir auch im deinem Programm vorstellen. den laut Julius wird die Message DTM_Raise WM_User+83 "Toggle Desktop" an die den Program Manager "Progman" gesendet, und diese Message versuchen wir mit dem oben gennanten Delphi-Code anzufangen aber leider komm ich da nicht weiter, weil ich zu wenig Erfahrung habe. :oops: Julius hat sich aber leider auch nicht mehr gemeldet. Vielleicht hast du noch eine Idee wie wir den Code zum laufen bringen. Für die nächsten 2 wochen bin ich viel unterwegs ich hoffe dass ich mich zwischendurch immer mal melden kann. Gruss Dieter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:25 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-2025 by Thomas Breitkreuz