Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Nach Explorer absturz (https://www.delphipraxis.net/205468-nach-explorer-absturz.html)

himitsu 15. Sep 2020 15:19

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.

venice2 15. Sep 2020 15:27

AW: Nach Explorer absturz
 
Zitat:

Zitat von himitsu (Beitrag 1473625)
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.

Bin wohl zu dumm begreife nicht was ihr wollt.
Habe meinen vorherigen Beitrag nochmal editiert.

Könntet ihr mir vielleicht anhand meiner Implementierung zeigen was, wo ich etwas ändern soll.

TurboMagic 15. Sep 2020 16:19

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?

venice2 15. Sep 2020 18:15

AW: Nach Explorer absturz
 
Zitat:

Zitat von TurboMagic (Beitrag 1473630)
Falls die Warteschleife doch unumgänglich sein sollte, schon mal dran gedacht diese mittels SLeep(1); drin etwas weniger CPU hungrig zu gestalten?

Warum?
Ich mache es anders.

Delphi-Quellcode:
         
repeat
  HwndTarget := FindWindow('Progman', 'Program Manager');
  WinProcessMessages;
  inc(Counter);
until (HwndTarget <> 0) or (Counter = 30000);
siehe!
Delphi-Quellcode:
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;
Da ist nichts CPU hungrig.
Alle Messagen werden weiter behandelt und sollten mit einem Sleep nicht unterbrochen werden.

Zitat:

Würdest du dich da registrieren, bekämst do scheinbar automatisch eine Windows Botschaft sobald der Taskbar gestartet wurde
Muss mich da mal schlau machen verstehe immer noch nicht warum ich ein extra Event definieren sollte.

venice2 15. Sep 2020 18:54

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:
  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);
Und gut ist.
Benötige dann die Schleife nicht mehr.

@Michael II, @himitsu
Thanks!

himitsu 15. Sep 2020 21:19

AW: Nach Explorer absturz
 
Ich weiß noch nicht seit wann Delphi-Referenz durchsuchenTApplicationEvents existiert (mindestens XE) und seit wann Delphi auch auf dieses Event registriert (mindestens seit es TTrayIcon gibt), aber ich weiß dass Delphi darauf reagiert und ...

Strg+Shift+F

Suchwort: TaskbarCreated
Dateifilter: *.pas;*.dfm;*.dpr;*.dpk;*.inc;*.txt
Verzeichnisse: $(BDS) mit Unterverzeichnissen

Schon findet man
Delphi-Quellcode:
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');
und landet letztendlich z.B. bei Application.OnSettingChange oder besser noch bei ApplicationEvents.OnSettingChange .

Michael II 16. Sep 2020 08:08

AW: Nach Explorer absturz
 
Cool venice2. Thema abgeschlossen :).

Nur noch eine kurze Frage himitsu... du schreibst:
Zitat:

Zitat von himitsu (Beitrag 1473646)
....und landet letztendlich z.B. bei Application.OnSettingChange oder besser noch bei ApplicationEvents.OnSettingChange .

Verstehe ich dich richtig? Du meinst damit, dass nach 'TaskbarCreated' ApplicationEvents.OnSettingChange ausgelöst wird?
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:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);

begin
  if msg.message = rm_TaskbarButtonCreated then
    "tu etwas (zum Beispiel RegisterRecyleBin(..);)"
end;
wobei
Delphi-Quellcode:
rm_TaskbarButtonCreated := RegisterWindowMessage('TaskbarButtonCreate');

Michael II 16. Sep 2020 08:49

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.

venice2 16. Sep 2020 09:31

AW: Nach Explorer absturz
 
Zitat:

Zitat von Michael II (Beitrag 1473658)
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.

Danke für die Infos.
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 OTTB64 Source include

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 14:32 Uhr.
Seite 3 von 3     123   

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