![]() |
AW: Nach Explorer absturz
Es ist das Event, wo du dein anderes Event/Notifier neu registrieren kannst/musst/solltest/darfst.
z.B. wird das auch verwendet, damit man seine TrayIcons neu registriert, nachdem die Taskleiste neu erstellt wurde. |
AW: Nach Explorer absturz
Zitat:
Habe meinen vorherigen Beitrag nochmal editiert. Könntet ihr mir vielleicht anhand meiner Implementierung zeigen was, wo ich etwas ändern soll. |
AW: Nach Explorer absturz
Würdest du dich da registrieren, bekämst do scheinbar automatisch eine Windows Botschaft sobald der Taskbar gestartet wurde, was nach einem automatischen Neustart des Explorers auch automatisch passiert. Wenn du aus diese Message triggerst, dann bräuchtest du vermutlich deine Warteschleife nicht.
Falls die Warteschleife doch unumgänglich sein sollte, schon mal dran gedacht diese mittels SLeep(1); drin etwas weniger CPU hungrig zu gestalten? |
AW: Nach Explorer absturz
Zitat:
Ich mache es anders.
Delphi-Quellcode:
siehe!repeat HwndTarget := FindWindow('Progman', 'Program Manager'); WinProcessMessages; inc(Counter); until (HwndTarget <> 0) or (Counter = 30000);
Delphi-Quellcode:
Da ist nichts CPU hungrig.
procedure WinProcessMessages;
var ProcMsg: TMsg; begin while PeekMessage(ProcMsg, 0, 0, 0, PM_REMOVE) do begin if (ProcMsg.message = WM_QUIT) then Exit; TranslateMessage(ProcMsg); DispatchMessage(ProcMsg); end; end; Alle Messagen werden weiter behandelt und sollten mit einem Sleep nicht unterbrochen werden. Zitat:
|
AW: Nach Explorer absturz
Ok jetzt verstehe ich was ihr meint.
Habe den SetWinEventHook entfernt. In WM_CREATE registriere ich jetzt die WindowMessage 'TaskbarCreated'
Delphi-Quellcode:
Und gut ist.
case Msg of
WM_CREATE: TaskbarRestart := RegisterWindowMessage('TaskbarCreated'); else if (Msg = TaskbarRestart) then begin MainApp.RegisterRecyleBin(WinHandle); SendMessage(WinHandle, WM_COMMAND, IDM_Restart, 0); end; end; Result := DefWindowProc(WinHandle, Msg, wP, lP); Benötige dann die Schleife nicht mehr. @Michael II, @himitsu Thanks! |
AW: Nach Explorer absturz
Ich weiß noch nicht seit wann
![]() Strg+Shift+F Suchwort: TaskbarCreated Dateifilter: *.pas;*.dfm;*.dpr;*.dpk;*.inc;*.txt Verzeichnisse: $(BDS) mit Unterverzeichnissen Schon findet man
Delphi-Quellcode:
und landet letztendlich z.B. bei Application.OnSettingChange oder besser noch bei ApplicationEvents.OnSettingChange .
else if Cardinal(Message.Msg) = RM_TaskbarCreated then
begin Perform(CM_WININICHANGE, 0, 0); Perform(CM_SYSCOLORCHANGE, 0, 0); Perform(CM_SYSFONTCHANGED, 0, 0); Perform(CM_PARENTCOLORCHANGED, 0, 0); Perform(CM_PARENTFONTCHANGED, 0, 0); Perform(CM_PARENTBIDIMODECHANGED, 0, 0); Perform(CM_PARENTDOUBLEBUFFEREDCHANGED, 0, 0); ... initialization InitProcs; RM_TaskBarCreated := RegisterWindowMessage('TaskbarCreated'); |
AW: Nach Explorer absturz
Cool venice2. Thema abgeschlossen :).
Nur noch eine kurze Frage himitsu... du schreibst: Zitat:
Bei meinem Delphi 14.1/Windows 10 nicht. D läuft zwar nach 'TaskbarCreated' bei vcl.forms.TCustomForm.WndProc (also "if Cardinal(Message.Msg) = RM_TaskbarCreated (TRUE)...") durch, aber nicht bei ApplicationEvents.OnSettingChange. Auch im ApplicationEvents.OnMessage kommt 'TaskbarCreated' nicht an. Was funktioniert: Im ApplicationEvents.OnMessage auf 'TaskbarButtonCreated' checken, also
Delphi-Quellcode:
wobei
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); begin if msg.message = rm_TaskbarButtonCreated then "tu etwas (zum Beispiel RegisterRecyleBin(..);)" end;
Delphi-Quellcode:
rm_TaskbarButtonCreated := RegisterWindowMessage('TaskbarButtonCreate');
|
AW: Nach Explorer absturz
Noch ein Tipp:
Windows registriert diverse Meldungen wie 'TaskbarCreated', 'TaskbarButtonCreated' und man kann auch eigene Meldungen registrieren (RegisterWindowMessage('MeineEigeneMeldung')). Einem Text wird also durch RegisterWindowMessage eine Nummer zugeordnet. Es gibt auch die Umkehrfunktion: Wenn du in deinem Programm checken willst, ob Windows solche registrierte Nummern/Meldungen M an deine App sendet, dann prüfst du dies mit GetClipboardFormatName(M, ...). In deinem Fall hättest du explorer.exe neu starten und dann in deiner App prüfen können, welche registrierten Windows Meldungen empfangen werden. Dies hätte dich auf die Spur 'TaskbarCreated' oder wenn du TApplicationEvents.OnMessage ausgewertet hättest auf 'TaskbarButtonCreated' geführt. |
AW: Nach Explorer absturz
Zitat:
Mit dem neustarten des Explorers ist so eine Sache denke mal nicht das eine Anwendung den Explorer neustarten sollte das ist eine Sache des Betriebssystem auf etwaige Probleme zu reagieren. Das mit der RegisterWindowMessage ist für mich vollkommen IO und was wichtig ist funktioniert immer. Beim setzen des Hook war das leider nicht gegeben. Nochmals Danke an euch. Hier der Test ![]() 1. Prog starten 2. erstelle imaginäre Text Datei. 3. Lösche diese (Papierkorb nicht löschen) 4. Starte den Windows Explorer neu 5. lösche den Papierkorb 5. Prüfe danach ob sich der Status des Papierkorbs von OTTB64 ändert. Darum ging es mir. EDIT: Nebenbei deine VCL-Lösung würde ich jeden empfehlen der ein Icon zum Tray addiert damit nach einem Absturz des Explorers das Programm weiterhin über das Icon bedienbar bleibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 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