matthiasr Geschrieben 13. Mai 2004 Geschrieben 13. Mai 2004 Hallo, also mit ShellExecute kann man ein Programm starten, wie kann ich ein Programm stoppen? Danke Matthias Zitieren
Goos Geschrieben 13. Mai 2004 Geschrieben 13. Mai 2004 Hallo, also mit ShellExecute kann man ein Programm starten, wie kann ich ein Programm stoppen? Danke Matthias Entweder suchst dir per Findwindow das Handle zu deinem gestarteten Programm und schickst anschliessen ne wm_Quit Message, oder du nimmst von vornherein CreateProcess und kein ShellExecute. Goos Zitieren
matthiasr Geschrieben 16. Mai 2004 Autor Geschrieben 16. Mai 2004 Hallo, ich würde gerne über WM_QUIT das Programm beenden, nun bin ich auf die Function WindowProc gestossen. Leider komme ich nicht zurecht damit, wenn ich LRESULT CALLBACK WindowProc(hWnd, WM_QUIT, NULL, NULL); verwenden möchte bekomme ich die Fehlermeldung error C2078: Zu viele Initialisierungen und die Warnung warning C4229: Anachronismus verwendet : Modifizierer der Daten werden ignoriert Wobei mir Anachronismus garnichts sagt. Wo liegt mein Fehler? Danke Matthias Zitieren
Guybrush Threepwood Geschrieben 16. Mai 2004 Geschrieben 16. Mai 2004 Erm, das brauchst du dazu überhaupt nicht Du musst nur, soboald du das Handle zum entsprechenden Haupfenster des Programms hast, mit SendMessage() die WM_QUIT Nachricht an das Handle schicken. Zitieren
Crush Geschrieben 16. Mai 2004 Geschrieben 16. Mai 2004 Halt Dich doch daran, was Goos gesagt. Das ist die einfachste Methode. Zitieren
Crush Geschrieben 16. Mai 2004 Geschrieben 16. Mai 2004 Ach, bevor Du lange rumrätselst, hab ich Dir die Lösung kurz geschrieben. Falls es mehrere Fenster mit gleichem Namen gibt, kannst Du auch schreiben: pwnd->PostMessage(WM_QUIT); oder auch WM_CLOSE wenn es nur um einzelne Fenster geht und das break; auslassen. (z.B. wenn man zig Internet Explorer Fenster über eigene Prozesse geöffnet hat und diese alle gleichzeitig auf Knopfdruck schließen will ohne den Maintask abzuschießen) Diese Methode ist allerdings nur für "normale" Fenster-Prozesse geeignet. Versteckte Prozesse, DLLs usw. abschießen ist ein wenig umständlicher. (Deshalb braucht man bei "Explorer.EXE" auch keine Angst haben!) Dein Problem ist damit allerdings sicherlich gelöst. CString name, Comparator("Explorer.EXE"); CWnd* pwnd = FindWindow(0,0); while (pwnd = pwnd->GetNextWindow()) { pwnd->GetWindowText(name); if (name.Find(Comparator) != -1) { pwnd->PostMessage(WM_SYSCOMMAND,SC_CLOSE); break; } } Für Experimentierfreudige empfehle ich damit etwas rumzuspielen (alle Fensternamen durchgucken). Man kann damit lustige Gag-Programme schreiben und so beispielsweise (sofort oder mit kurzer Sleep()-Verzögerung) die komplette Bedienleiste mit allen Tasks und Programmen (unten) einfach killen oder die Icons auf dem Desktop ins Nichts verschwinden lassen. Ist bestimmt sehr verwirrend und ärgerlich, wenn man das jemanden direkt in den Autostart reinhängt =8-) Zitieren
matthiasr Geschrieben 17. Mai 2004 Autor Geschrieben 17. Mai 2004 Hallo, erstmals vielen Dank für die Hilfe, aber CWnd* pwnd = FindWindow(0,0); iss nicht, denn der Rückgabe Wert von FindWindow ist ein HWND, sagt VS und MSDN und daran hängt sich Dein ganzer Code auf. Ich verstehe um was es geht aber ich weis nicht wie ich es besser umsetzen könnte Meine Versuche enden mit HWND hWnd = FindWindow(0, "Posteingang - Microsoft Outlook"); SendMessage(hWnd, WM_QUIT,SC_CLOSE,0); Ohne Fehlermeldung aber auch ohne Ergebniss. Matthias Zitieren
Klotzkopp Geschrieben 17. Mai 2004 Geschrieben 17. Mai 2004 SC_CLOSE funktioniert nur mit WM_SYSCOMMAND. Ich weiß nicht, wie du auf WM_QUIT kommst, aber damit wird es nicht klappen. PostMessage(hWnd, WM_SYSCOMMAND, SC_CLOSE, 0); [/CODE] oder[CODE]PostMessage(hWnd, WM_CLOSE, 0, 0); sollte es tun. Zitieren
Guybrush Threepwood Geschrieben 17. Mai 2004 Geschrieben 17. Mai 2004 Ich weiß nicht, wie du auf WM_QUIT kommst, aber damit wird es nicht klappen. ...und schickst anschliessen ne wm_Quit Message, oder... :floet: Zitieren
Goos Geschrieben 17. Mai 2004 Geschrieben 17. Mai 2004 :floet: *heul*....ich habs nicht so gemeint Goos Zitieren
Crush Geschrieben 17. Mai 2004 Geschrieben 17. Mai 2004 @matthiasr Bei mir hat das so ohne Probleme funktioniert. Ich habs extra noch mit ein paar Programmen ausgetestet. Was man zurückbekommt hängt davon ab, in welchem Namespace man sich befindet und welche Parameter man verwendet. Such mal in der MSDN unter "FindWindow method". Da gibt es dann static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTR lpszWindowName ); Ansonsten beachte bitte dringend was Klotzkopp sagt. Der WM_QUIT funktioniert allerdings selbst bei korrekter Anwendung nicht mal halb so zuverlässig wie der Syscommand, den ich deshalb der Window-Message vorziehe. Der WM_CLOSE aufs Main-Window führt im Vergleich zum WM_QUIT nach meiner Erfahrung oftmals zu besseren Ergebnissen. Warum sich das allerdings so verhält hab ich nicht weiter nachgeschaut. Vielleicht kann noch jemand eine Erklärung zu diesem Phänomen nachliefern? (Hallo Klotzkopp, Du scheinst irgendwas Genaueres dazu zu wissen, stimmts?) Zitieren
Klotzkopp Geschrieben 17. Mai 2004 Geschrieben 17. Mai 2004 Vielleicht kann noch jemand eine Erklärung zu diesem Phänomen nachliefern? (Hallo Klotzkopp, Du scheinst irgendwas Genaueres dazu zu wissen, stimmts?) Hier gibt es ein paar Informationen zu dem Thema. Da wird WM_QUIT übrigens überhaupt nicht erwähnt. Wenn WM_QUIT in einer Nachrichtenschleife auftritt, gibt der zugehörige Aufruf von GetMessage FALSE zurück. Da die Nachrichtenschleife meist in etwa so aussieht: while(GetMessage(...)) { DispatchMessage(...); }[/CODE]wird bei WM_QUIT diese Schleife beendet, d.h. die Anwendung kann z.B. nicht mehr nachfragen, ob ungespeicherte Dokumente gespeichert werden sollen. Mit SendMessage sollte WM_QUIT eigentlich gar nicht funktionieren, denn SendMessage ruft direkt die WndProc auf, ohne Umweg über die Nachrichtenschleife. Wenn die Anwendung also nicht auch in der WndProc auf WM_QUIT mit Terminierung reagiert, dann läuft die Anwendung weiter. Also: Wenn WM_QUIT, dann mit PostMessage. WM_CLOSE bzw. WM_SYSCOMMAND ist aber zu bevorzugen, damit die Anwendung sich selbst sauber beenden kann. Zitieren
Crush Geschrieben 18. Mai 2004 Geschrieben 18. Mai 2004 Wenn die Anwendung also nicht auch in der WndProc auf WM_QUIT mit Terminierung reagiert, dann läuft die Anwendung weiter Danke! Wieder mal was Wichtiges gelernt. Sowas hab ich auch schon vermutet. Zitieren
matthiasr Geschrieben 18. Mai 2004 Autor Geschrieben 18. Mai 2004 Danke an alle, mit HWND hWnd = FindWindow(0, "Posteingang - Microsoft Outlook"); PostMessage(hWnd, WM_CLOSE,0,0); hat es geklappt. Ich bin mir über meine Versuche nicht immer im klaren was Sie wirklich bewirken und warum sie oftmals nicht klappen. Werde mir Eure Posts nochmal genau zu gemüte führen, konnte aber schon viel daraus lernen. Ist ein gern gefragtes Forum in dem man fast immer eine Lösung erhält. Gruß Matthias Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.