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/)
-   -   Windows-Explorer beenden (https://www.delphipraxis.net/168195-windows-explorer-beenden.html)

hesch21 9. Mai 2012 14:36

Windows-Explorer beenden
 
Hallo zusammen

bitte sagt nicht 'schon wieder'! Ich habe wirklich so ziemlich alle Beiträge gelesen, wie man einen Prozess beendet und schaffe dies auch mittels TerminateProcess. Nur: Das 'killt' den Prozess und ich muss den Explorer (in Windows 7) sauber beenden, so dass er seine Registry-Einträge (vor allem die TrayIcon-Einträge) zurück schreibt.
Das muss irgendwie gehen, gibt es doch eine versteckte Menüposition, die genau das macht: Mit der Windows-Taste das Startmenü öffnen, Ctrl-Shift drücken und mit der rechten Maustaste in den leeren Bereich des Menüs klicken. Es erscheint ein Menü mit 'Explorer beenden'. Vielleicht ein Tipp für diejenigen die das noch nicht wussten.

Ich habe nun irgendwo folgendes gefunden:

Zitat:

BOOL ExitExplorer()
{ HWND hWndTray = FindWindow(_T("Shell_TrayWnd"), NULL);
return PostMessage(hWndTray, 0x5B4, 0, 0); }
und dort wird behauptet, das würde funktionieren. Meine Umsetzung in Delphi
Code:
                 hd := FindWindow(nil, 'Shell_TrayWnd');
                  PostMessage(hd, $5b4, 0, 0);
führt aber nur dazu, dass ein zusätzliches Explorer-Fenster geöffnet wird.

PS: Das ganze geht darum, dass die liebe Microsoft gefunden hat, man dürfe programmtechnisch die TrayIcons in W7 nicht mehr im Tray fixieren. Das sei dem Bnutzer zu überlassen. Dämlich wenn man aber ein Alarmierungs-Tool hat, von dem ausser diesem Icon nichts sichtbar ist und bei einem Alarm lediglich durch eine Veränderung des Icons angezeigt werden kann/darf, dass der Alarm weitergeleitet wurde. Dann MUSS das Icon immer sichtbar sein. Wie man das entgegen den Normen von Microsoft Allmighty in der Registry umstellt, habe ich auch schon raus gefunden. Aber ich muss zuvor eventuelle Änderungen des Explorers zurück schreiben.

Jemand eine Idee wo bei meiner Umsetzung des obigen Codes der Fehler ist oder wie man das anders lösen könnte?

DeddyH 9. Mai 2012 14:46

AW: Windows-Explorer beenden
 
Hat das einen Grund, dass Du die Werte für FindWindow vertauscht hast?

jaenicke 9. Mai 2012 15:09

AW: Windows-Explorer beenden
 
Zitat:

Zitat von hesch21 (Beitrag 1165616)
PS: Das ganze geht darum, dass die liebe Microsoft gefunden hat, man dürfe programmtechnisch die TrayIcons in W7 nicht mehr im Tray fixieren. Das sei dem Bnutzer zu überlassen. Dämlich wenn man aber ein Alarmierungs-Tool hat, von dem ausser diesem Icon nichts sichtbar ist

Wenn der Benutzer das möchte, kann er das ja umstellen. Dafür zeige ich dann z.B. eine kleine Hilfe an wie man dies machen kann und damit hat sich das. Wenn er es möchte, kann er es ändern, wenn nicht, dann möchte er das eben nicht.

Etwas einfach im System einfach zu ändern, ist leider eine Unart, die viele Programme "auszeichnet". :roll: Deshalb finde ich es auch gut, dass Microsoft da gegensteuert. Richtlinien alleine helfen ja offenbar nicht...

Jedenfalls funktioniert es bei mir mit den ursprünglichen Werten für FindWindow, aber dir muss klar sein, dass es damit unter Windows 8 z.B. logischerweise nicht mehr funktionieren wird. Und dort gibt es auch noch weitere Schutzmechanismen gegen falsches Verhalten von Programmen.

// EDIT:
Also bei mir sind wie zu erwarten auch bei einem Beenden des Explorers auf diesem Weg die Trayicons weg, die nicht auf die Nachricht zum Wiederherstellen reagieren. (Falls das das ist was du meintest, das gespeichert werden soll.)

hesch21 9. Mai 2012 15:20

AW: Windows-Explorer beenden
 
Hallo DaddyH

dämlich! Kommt davon, wenn man keine Ahnung von C hat und nicht kapiert, was das _T soll.
OK, jetzt funktionierts tatsächlich ... halbwegs! Der 'eigentliche' Explorer verabschiedet sich, dafür geht noch ein 'normales' Explorer-Fenster auf. Aber ich nehme mal, damit werde ich auch noch fertig. Das kann ich nun wirklich noch mit TerminateProcess wieder abschiessen.

Danke!

Lieber Jaenicke

Meine Applikation ist beispielsweise bei einem Kundem mit 1'400 Benutzern im Einsatz. Reicht das bereits als Begründung? Ich glaube kaum, dass die dortigen Systembetreuer Freude daran hätten, dieser Anzahl Benutzer beizubringen, wie sie das umstellen können und dass sie es umstellen müssen. Geschweige denn, die Sache noch zu kontrollieren. Und nochmals, es geht um die Sicherheit dieser Benutzer und damit lässt sich einfach nicht spielen oder es kann nicht dem Zufall überlassen werden, ob der Benutzer will, kann und wann.

CCRDude 9. Mai 2012 15:30

AW: Windows-Explorer beenden
 
Wenn die Systembetreuer dort Windows 7 installieren, aber keine Lust haben, die von ihnen Betreuten darin einzuweisen, spricht das aber so gar nicht für die Systembetreuer.

Auch nicht für den Auftraggeber natürlich, der andere Methoden als das Tray-Icon zu verbieten scheint. Denn Deine sonstige Begrünudng reicht meiner Meinung nach nicht - alle Design-Sünden können mit derartigen Ausreden schöngeredet werden.

Wenn man etwas nicht "dem Zufall überlassen will", muss man halt verhandeln, ob es keine Alternativen zum Tray-Icon gibt, mit Hinweis auf Konventionen. Ein Deskband(?) in der Taskleiste zum Beispiel wäre sogar sichtbarer.

jaenicke 9. Mai 2012 15:44

AW: Windows-Explorer beenden
 
Mal davon abgesehen, dass die Benutzer sicherlich zentral verwaltet werden und es daher auch zentral konfiguriert werden kann. Da macht es erst Recht keinen Sinn, dass das ein Programm lokal macht...

himitsu 9. Mai 2012 15:48

AW: Windows-Explorer beenden
 
Wobei da sicherheitstechnisch wohl etwas vollkommen schief geplant ist, wenn die Sicherheit von einem winzigen und kaum sichtbaren Icon abhängt, welches eventuell auch mal nicht sichtbar ist. :stupid:

Dalai 9. Mai 2012 15:54

AW: Windows-Explorer beenden
 
Und du hältst das wirklich für eine gute Idee, einfach den Explorer abzuschießen, zu beenden oder wie auch immer du das nennen willst, nur um damit das Icon deines ach so wichtigen Programms sichtbar zu machen? Spitzenidee, warum machen das nicht alle so. Ach, halt, es gibt ja gesunden Menschenverstand und auch entsprechende Designrichtlinien :roll:.

Sorry für die überspitzte Darstellung, aber jetzt mal ernsthaft: Glaubst du wirklich, dass das eine gute Idee ist? Wenn dein Programm so wichtig ist, dann gibt es genügend andere Möglichkeiten, denn entweder dein Alarm ist so wichtig, dass darauf reagiert werden muss oder er ist es nicht (und man kann auf ihn verzichten).

Wenn der Alarm wichtig ist, dann schalten entweder die SysAdmins (so sie denn fähig sind) das auf allen Rechnern um (es gibt eine Gruppenrichtlinie, die dafür sorgt, dass immer alle TrayIcons sichtbar sind) oder es muss eine andere Art von Alarmierung/Benachrichtigung der Nutzer her. Alles andere ist Gefrickel, wie man es so schön nennt, und schlechtes Design noch dazu.

Ergänzung: Und beachte auch, dass durch ein solches "Design" auch Kollateralschäden entstehen können, denn nicht alle Programme stellen ihr Trayicon beim Neustart des Explorer wieder her.

MfG Dalai

hesch21 9. Mai 2012 16:55

AW: Windows-Explorer beenden
 
Liebe Mitdenker
wenn Ihr wirklich so auf die Schnelle glaubt, über eine Applikation urteilen zu können, die doch bei einigen hundert Kunden und somit bei einigen tausend Benutzern im Einsatz ist, so gratuliere ich Euch zu Eurer schnellen Auffassungsgabe und Urteilsvermögen.
Erstes: Es geht wirklich um Sicherheit, um die persönliche Sicherheit der Mitarbeiter, um den Schutz vor Angriffen. Da steht für mich jede noch so gut gemeinte Richtlinie von Microsoft hinten an.
Zweitens: Über GPL können nur ALLE TrayIcons sichtbar gemacht werden, nicht einzelne. Den REG-Key kenne ich auch. Ist sicher auch nicht das gewünschte.
Drittens: Wer lesen kann, ist klar im Vorteil: Es geht nicht um die Anzeige von Alarmmeldungen. Die Erscheinen logischerweise als Topmost-Window mit Sound mitten auf dem Bildschirm (egal ob ein Benutzer angemeldet ist, ein Screenblanker läuft oder irgend ein LOGON-Window aktiv ist). Es geht im die Alarmauslösung. Und die muss still erfolgen aus einem im Hintergrund laufenden Programm (über eine Tastenkombination oder einen USB-Taster). So, und wie soll nun bitte die Person, die den Alarm ausgelöst hat und bedroht wird, möglichst ohne etwas zu machen und so, dass der Bedroher möglichst nichts merkt, sehen, was mit seiner Alarmmeldung läuft? Das TrayIcon wechselt das Aussehen! Ist aber etwas dämlich, wenn man es nicht sieht!
Viertes: Es wäre ziemlich stumpfsinnig, irgend einen Bildschirmbereich (topmost?) mit etwas zu belegen, das einerseit wirklich nur die Grösse eines Icons benötigt und andererseits vermutlich, respektive hoffentlich nie gebraucht wird. Wenn's aber gebraucht wird, muss es zu 100% funktionieren.
Fünftens: Das mit dem Neustart des Explorers würde mein Programm ein einziges Mal machen, nämlich beim ersten Programmstart. Und da dieser über Autostart erfolgt, tut das auch noch keinem Benutzer weh.

So, jetzt dürft ihr weiterhin an meinem gesunden Menschenverstand zweifeln. Ich persönlich habe leider das Gefühl, das Microsoft auch nicht an den gesunden Menschenverstand der Software-Entwickler glaubt und uns auf diese Weise das Leben schwer macht. Solange die Normen mit Sicherheit zu tun haben, kann ich damit leben, wenn es aber um Design geht, ist es Schikane, wenn keine Möglichkeiten bestehen, einen Kreis mit einer Ellipse zu ersetzen.

p80286 9. Mai 2012 17:42

AW: Windows-Explorer beenden
 
Das Dein Programm von mehreren Hundert Kunden eingesetzt wird...Seit wann ist Menge ein Zeichen von Qualität?
Wobei meine Zweifel sich nicht auf Dein Programm beziehen, sondern auf die Entscheidung, eine Alarmmeldung einem PC(-Netzwerk) anzuvertrauen.

Ich für meinen Teil bin froh, daß Windows nicht das Betriebssystem meines Autos ist, denn auch das muß 100% sicher bzw. zuverlässig sein.
Wenn ich mir vorstelle ein aufgebrachter Kunde würde meinen Arbeitsplatz besuchen und ich könnte eine Alarmmeldung meinem PC anvertrauen,
Da ist Weglaufen wohl sicherer.

Gruß
K-H

jaenicke 9. Mai 2012 17:48

AW: Windows-Explorer beenden
 
Zitat:

Zitat von p80286 (Beitrag 1165699)
Wobei meine Zweifel sich nicht auf Dein Programm beziehen, sondern auf die Entscheidung, eine Alarmmeldung einem PC(-Netzwerk) anzuvertrauen.

Naja, da gibt es wohl nicht allzu viele Alternativen nehme ich an. Das ist einfach eine Frage der Machbarkeit und darüber zu diskutieren bringt hier wohl wenig. ;-)

Zitat:

Zitat von hesch21 (Beitrag 1165692)
Ich persönlich habe leider das Gefühl, das Microsoft auch nicht an den gesunden Menschenverstand der Software-Entwickler glaubt und uns auf diese Weise das Leben schwer macht.

Dass das nicht funktioniert daran zu appellieren, haben schon genügend Entwickler bzw. deren Erzeugnisse gezeigt...

Alleine schon die vielen tausend Entwickler, die ohne Sinn und Verstand einfach in das eigene Verzeichnis geschrieben haben, weil man ja König auf dem PC des Benutzers ist. Oder diejenigen, die einfach die Bildschirmauflösung ändern, statt das eigene Programm zu skalieren. Da könnte ich noch dutzende weit verbreiteter Beispiele bringen...

Zitat:

Zitat von hesch21 (Beitrag 1165692)
Solange die Normen mit Sicherheit zu tun haben, kann ich damit leben, wenn es aber um Design geht, ist es Schikane, wenn keine Möglichkeiten bestehen, einen Kreis mit einer Ellipse zu ersetzen.

Nein, es geht nicht um Sicherheit. Es geht um die Benutzererfahrung bei der Arbeit mit dem Computer. Und Benutzereinstellungen sind nun einmal Benutzereinstellungen und nichts anderes. Eben weil der Benutzer (oder ein Administrator) diese machen sollte und nicht einzelne Programme. Damit der Benutzer die Kontrolle über den PC behält und eben nicht irgendeine Software diese ihm entzieht.

Zitat:

Zitat von hesch21 (Beitrag 1165692)
wenn Ihr wirklich so auf die Schnelle glaubt, über eine Applikation urteilen zu können, die doch bei einigen hundert Kunden und somit bei einigen tausend Benutzern im Einsatz ist, so gratuliere ich Euch zu Eurer schnellen Auffassungsgabe und Urteilsvermögen.

Es bezweifelt ja niemand, dass diese Einstellung sinnvoll sein mag, wenn es denn so umgesetzt werden soll wie es bei dir der Fall ist. Und auch wir entwickeln Software, bei denen einige Systemstandards nicht umgesetzt werden können.

Das ändert aber nichts daran, dass solche Einstellungen nicht durch das Programm, sondern durch ein Setup, durch die Softwareverteilung im Unternehmen, durch einen Administrator, ... kurz, eben durch die normalen Kanäle... gemacht werden sollten.
Wenn das in dem Fall nicht möglich ist, ist das traurig was die Rechnerorganisation in einer solchen Größenordnung angeht... aber dann wohl auch nicht zu ändern, jedenfalls nicht für diesen Fall.

Jedenfalls ist bei uns dokumentiert welche Einstellungen notwendig sind und/oder unsere Supporter machen diese Einstellungen bei der Installation. Auch im Setup sind entsprechende Optionen enthalten. Aber wir fummeln nicht mit unseren Programmen an solchen Einstellungen herum.

Dalai 9. Mai 2012 18:47

AW: Windows-Explorer beenden
 
Zitat:

Zitat von hesch21 (Beitrag 1165692)
Zweitens: Über GPL können nur ALLE TrayIcons sichtbar gemacht werden, nicht einzelne. Den REG-Key kenne ich auch. Ist sicher auch nicht das gewünschte.

Wie wär's, die SysAdmins des Netzwerks einfach zu fragen, ob man diese Einstellung nicht setzen könnte? Sicher ist, dass deine Methode die ziemlich dümmste ist, die man anwenden könnte.

Zitat:

Es geht im die Alarmauslösung. Und die muss still erfolgen aus einem im Hintergrund laufenden Programm (über eine Tastenkombination oder einen USB-Taster). So, und wie soll nun bitte die Person, die den Alarm ausgelöst hat und bedroht wird, möglichst ohne etwas zu machen und so, dass der Bedroher möglichst nichts merkt, sehen, was mit seiner Alarmmeldung läuft? Das TrayIcon wechselt das Aussehen!
Auch wenn mir nicht klar ist, welche Art von Bedrohung das sein soll, so verstehe ich nicht, warum ein Angreifer eine Meldung auf dem Bildschirm bemerkt, aber ein TrayIcon übersehen könnte. Wenn der Angreifer das sieht, was auch der Benutzer sieht, dann ist das Konzept unsinnig. Wenn der Angreifer nicht denselben Bildschirminhalt sieht, dann kann man auch eine normale Meldung bringen (oder ein Popup des TrayIcons).

Zitat:

Fünftens: Das mit dem Neustart des Explorers würde mein Programm ein einziges Mal machen, nämlich beim ersten Programmstart. Und da dieser über Autostart erfolgt, tut das auch noch keinem Benutzer weh.
Wer sagt dir, dass nicht irgendein anderes wichtiges Programm vor deinem im Autostart gestartet wird und sein TrayIcon nicht wiederherstellen kann? Die Programme im Autostart werden in zufälliger Reihenfolge ausgeführt, sofern man nicht Drittprogramme benutzt, die eine bestimmte Reihenfolge erzwingen. Und während der Anmeldung eines Benutzers (während der Initialisierung) den Explorer abzuschießen, ist auch eine gute Idee :stupid:.

Zitat:

Zitat von p80286
Wobei meine Zweifel sich nicht auf Dein Programm beziehen, sondern auf die Entscheidung, eine Alarmmeldung einem PC(-Netzwerk) anzuvertrauen.

Das haben wir bei uns in der Firma auch so eingerichtet. Konkret prüft der Router bestimmte Netzwerkkomponenten (3 Server, 4 Switches, 2 USVs), ob sie erreichbar sind. Ist eine Komponente davon weg, werden SMS und Anrufe an bestimmte Telefonnummern ausgelöst (via ISDN). Das hat auch in der Vergangenheit gut funktioniert, so wurden schon Stromausfälle wegen einer rausgeflogenen Sicherung ermittelt und vor Ort behoben. Insofern kann ein Warnsystem schon sinnvoll in die "Hände" eines PCs gelegt werden. Dazu sei jedoch gesagt, dass auf dem natürlich Router kein Windows-System läuft sondern fli4l :).

MfG Dalai

Popov 9. Mai 2012 18:52

AW: Windows-Explorer beenden
 
Hallo hesch21, ich will nicht über dein Programm urteilen und sicherlich hast du einen Grund für ein Alarm über ein Tray-Icon, trotzdem, und das ist nur meine Meinung und soll keine Wertung sein, Hinweise über Tray-Icon sind doch Kokolores. Das ist wie ein Pfeil auf der Tür Richtung Türklinke mit dem Hinweistext: Türklinke. Man kann es machen, aber ...

Die halbe Welt informiert inzwischen über ein Hinweisfenster, platziert in rechten unterem Bildschirmrand. Wenn mein Kaspersky ein Update macht, dann ändert sich das Icon (weil es ein Hinweis ist, aber nichts wichtiges), wenn er aber was gefunden hat, öffnet sich ein Hinweisfenster.

Wie gesagt, soll aber keine Wertung sein.

jaenicke 9. Mai 2012 20:37

AW: Windows-Explorer beenden
 
Ich glaube ihr versteht das jetzt falsch was die Alarmmeldung angeht, lest den Text vielleicht nochmal genau. ;-) Das Trayicon verstehe ich für den Zweck, den ich mir vorstelle, schon als Lösung. Auch die sonstige Umsetzung.

Stören tut mich an solchen Lösungen eben nur, dass Einstellungen am System vorbei gesetzt werden, die man nicht aus Programmen heraus setzen sollte. Aber wie ich auch schon geschrieben habe, wenn das Netzwerk nicht ordentlich organisiert ist, so dass eine zentrale Lösung fehlt, dann bleibt wohl kaum eine andere Lösung...

Deshalb will ich auch nicht behaupten, dass die Lösung in dem Fall falsch ist, aber die Warnung ist dennoch angebracht, dass es gute Gründe gibt es wenn irgend möglich nicht so zu machen.


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