Zum Inhalt springen

Empfohlene Beiträge

Geschrieben
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

Geschrieben

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

Geschrieben

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-)

Geschrieben

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

Geschrieben

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.

Geschrieben

@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?)

Geschrieben
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.

Geschrieben
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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...