<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Fremden Prozess beenden!]]></title><description><![CDATA[<p>Hi.</p>
<p>Mein Ziel ist es einen fremden Prozess so zu beenden, als hätte der Benutzer den Process selbst beendet. Es ist wichtig, dass der fremde Prozess ganz normal beendet wird, da er sonst nicht alle gesammelten Informationen abspeichert.</p>
<p>Ich verwende folgende Funktion, um den Process zu beenden:</p>
<p>(nach der CreateRemoteThread-Anleitung auf <a href="http://www.edgeofnowhere.cc/viewtopic.php?p=2483118" rel="nofollow">http://www.edgeofnowhere.cc/viewtopic.php?p=2483118</a>)</p>
<pre><code class="language-cpp">void __fastcall TerminateApp(DWORD pid)
{
  LPVOID LoadLibAddy;
  HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS,false, pi.dwProcessId);
  if (hWnd == 0) ShowMessage(&quot;Cannot open process!&quot;);
  LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle(&quot;kernel32.dll&quot;), &quot;ExitProcess&quot;);
  if (LoadLibAddy == 0) ShowMessage(&quot;GetProcAddress failed!&quot;);
  if(!CreateRemoteThread(hWnd, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)0, NULL, NULL)) ShowMessage(&quot;CreateRemoteThread failed!&quot;);
}
//---------------------------------------------------------------------------
</code></pre>
<p>Das Problem ist, dass der Prozess so beendet wird als hätte ich TerminateProcess verwendet. Wende ich den Code z.B. auf MS Word an, kommt nicht die Nachfarge, ob ich meine Arbeit speichern möchte. Der Prozess wird einfach beendet.</p>
<p>Hat hier jemand einen Alternativvorschlag?<br />
Mit SendMessage(hWnd, WM_QUIT,0,0) habe ich es leider nicht hinbekommen.</p>
<p>Ich freue mich schon auf weitere Ideen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/159711/fremden-prozess-beenden</link><generator>RSS for Node</generator><lastBuildDate>Sun, 19 Jul 2026 13:38:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/159711.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Sep 2006 11:04:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fremden Prozess beenden! on Mon, 18 Sep 2006 11:04:08 GMT]]></title><description><![CDATA[<p>Hi.</p>
<p>Mein Ziel ist es einen fremden Prozess so zu beenden, als hätte der Benutzer den Process selbst beendet. Es ist wichtig, dass der fremde Prozess ganz normal beendet wird, da er sonst nicht alle gesammelten Informationen abspeichert.</p>
<p>Ich verwende folgende Funktion, um den Process zu beenden:</p>
<p>(nach der CreateRemoteThread-Anleitung auf <a href="http://www.edgeofnowhere.cc/viewtopic.php?p=2483118" rel="nofollow">http://www.edgeofnowhere.cc/viewtopic.php?p=2483118</a>)</p>
<pre><code class="language-cpp">void __fastcall TerminateApp(DWORD pid)
{
  LPVOID LoadLibAddy;
  HANDLE hWnd = OpenProcess(PROCESS_ALL_ACCESS,false, pi.dwProcessId);
  if (hWnd == 0) ShowMessage(&quot;Cannot open process!&quot;);
  LoadLibAddy = (LPVOID)GetProcAddress(GetModuleHandle(&quot;kernel32.dll&quot;), &quot;ExitProcess&quot;);
  if (LoadLibAddy == 0) ShowMessage(&quot;GetProcAddress failed!&quot;);
  if(!CreateRemoteThread(hWnd, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddy, (LPVOID)0, NULL, NULL)) ShowMessage(&quot;CreateRemoteThread failed!&quot;);
}
//---------------------------------------------------------------------------
</code></pre>
<p>Das Problem ist, dass der Prozess so beendet wird als hätte ich TerminateProcess verwendet. Wende ich den Code z.B. auf MS Word an, kommt nicht die Nachfarge, ob ich meine Arbeit speichern möchte. Der Prozess wird einfach beendet.</p>
<p>Hat hier jemand einen Alternativvorschlag?<br />
Mit SendMessage(hWnd, WM_QUIT,0,0) habe ich es leider nicht hinbekommen.</p>
<p>Ich freue mich schon auf weitere Ideen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139477</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139477</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Mon, 18 Sep 2006 11:04:08 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Mon, 18 Sep 2006 12:03:45 GMT]]></title><description><![CDATA[<p>Das ist ja auch ein Holzhammer. Sende einfach WM_CLOSE per PostMessage/SendMessage je nachdem wie Du synchronisieren willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139516</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 18 Sep 2006 12:03:45 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Mon, 18 Sep 2006 15:38:15 GMT]]></title><description><![CDATA[<p>Danke für die Antwort. Diesen Weg</p>
<pre><code class="language-cpp">if (!PostMessage(FindWindow(&quot;ZSNESWIN&quot;,0), WM_CLOSE,0,0)) ShowMessage(&quot;PostMessage failed&quot;);
</code></pre>
<p>habe ich auch schon ausprobiert. Der Prozess läuft weiter aber die GUI wird wenigstens geschlossen^^.</p>
<p>Ich habe nochmal folgenden Quellcode verwendet, um alle zum Prozess gehörenden Fenster zu schließen (von <a href="http://support.microsoft.com/default.aspx?scid=KB;en-us;178893&amp;" rel="nofollow">http://support.microsoft.com/default.aspx?scid=KB;en-us;178893&amp;</a>):</p>
<pre><code class="language-cpp">BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam ) ;

DWORD __fastcall TerminateApp2( DWORD dwPID, DWORD dwTimeout )
   {
	  HANDLE   hProc ;
	  DWORD   dwRet ;

	  // If we can't open the process with PROCESS_TERMINATE rights,
	  // then we give up immediately.
	  hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE,
		 dwPID);

	  if(hProc == NULL)
	  {
		ShowMessage(&quot;Cannot open process!&quot;);
	  }

	  // TerminateAppEnum() posts WM_CLOSE to all windows whose PID
	  // matches your process's.
	  EnumWindows((WNDENUMPROC)TerminateAppEnum, (LPARAM) dwPID) ;

	  // Wait on the handle. If it signals, great. If it times out,
	  // then you kill it.
	  if(WaitForSingleObject(hProc, dwTimeout)!=WAIT_OBJECT_0)
		 ShowMessage(&quot;Process needs to be killed the hard way&quot;);
	  else
		 ShowMessage(&quot;Process was cleanly terminated&quot;);

	  CloseHandle(hProc) ;

	  return dwRet ;
   }

//---------------------------------------------------------------------------
BOOL CALLBACK TerminateAppEnum( HWND hwnd, LPARAM lParam )
   {
      DWORD dwID ;

	  GetWindowThreadProcessId(hwnd, &amp;dwID) ;

	  if(dwID == (DWORD)lParam)
	  {
		 PostMessage(hwnd, WM_CLOSE, 0, 0) ;
	  }

	  return TRUE ;
   }
</code></pre>
<p>Die Fenster werden alle wunderbar geschlossen. Auch die Informationen, die gespeichert werden sollen, werden gespeichert. Der einzige Hacken ist, dass der Prozess auch ohne Fenster weiterläuft, sowie die Spielmusik weiterhin zu hören ist. Da jedoch alle Informationen gespeichert wurden, kann man ihn ja an dieser Stelle mit TerminateProcess beenden^^.<br />
Gibt es für diese Methode noch Verbesserungsmöglichkeiten? Wenn ich auf das X klicke, bzw ALT+F4 drücke wird der Prozess ja &quot;richtig&quot; und &quot;vollständig&quot; beendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139750</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Mon, 18 Sep 2006 15:38:15 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Mon, 18 Sep 2006 15:44:47 GMT]]></title><description><![CDATA[<p>Da habe ich mich wohl zu früh gefreut <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Die Informationen werden doch nicht gespeichert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /><br />
Es muss also noch einen anderen weg geben, um ein Programm zu beenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1139756</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1139756</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Mon, 18 Sep 2006 15:44:47 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Tue, 19 Sep 2006 12:15:18 GMT]]></title><description><![CDATA[<p>Mit einem Snapshot kannst du durch die Prozesse gehen, und bekommst dann den Handle mit OpenProcess, die du für TerminateProcess brauchst.</p>
<p>Pseudo-Code:</p>
<pre><code class="language-cpp">hSnapshot = CreateToolhelp32Snapshot();
Process32First(hSnapshot, &amp;pe);

while(Process32Next(hSnapshot, &amp;pe) != ERROR_NO_MORE_FILES)
{
   hProcess = OpenProcess(pe.th32ProcessId);
   TerminateProcess(hProcess);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1140318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1140318</guid><dc:creator><![CDATA[qasdfgh]]></dc:creator><pubDate>Tue, 19 Sep 2006 12:15:18 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Tue, 19 Sep 2006 21:19:22 GMT]]></title><description><![CDATA[<p>Das Handle ist ja nicht das Problem. Der fremde Prozess wird ja von mir mit CreateProcess erstellt. TerminateProcess funktioniert leider zu gut. Der Prozess soll aber beendet werden als hätte ich auf das X (schließen) geklickt, da sonst von dem Prozess gesammelte Informationen verloren gehen.</p>
<p>Wie würde der Befehl für SendMessage lauten, um dem Fenster die Message ALT+F4 zu schicken. Mit keybd_event funktioniert es leider nicht nicht.</p>
<p>Vielleicht ist es für euch nochmal hilfreich zu wissen, dass es sich um eine Art Frontend handelt. Der fremde Prozess wir von meinem Programm gestartet und soll dann duch eine Tastenkombinatino wieder beendet werden (nur nicht mit TerminateProcess).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1140715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1140715</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Tue, 19 Sep 2006 21:19:22 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Wed, 20 Sep 2006 06:22:31 GMT]]></title><description><![CDATA[<p>Mapp schrieb:</p>
<blockquote>
<p>Danke für die Antwort. Diesen Weg</p>
<pre><code class="language-cpp">if (!PostMessage(FindWindow(&quot;ZSNESWIN&quot;,0), WM_CLOSE,0,0)) ShowMessage(&quot;PostMessage failed&quot;);
</code></pre>
<p>habe ich auch schon ausprobiert. Der Prozess läuft weiter aber die GUI wird wenigstens geschlossen^^.</p>
</blockquote>
<p>Logo! Du findest ja auch das Fenster nicht! Und dann sendest Du an NULL!<br />
Sorge erstmal dafür das fenster zu finden... Dann sende WM_CLOSE!</p>
<p>Wenn Du möchtest, dass Daten gespeichert werden ist WM_CLOSE der einzige Ansatz!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1140801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1140801</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Wed, 20 Sep 2006 06:22:31 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Wed, 20 Sep 2006 07:50:49 GMT]]></title><description><![CDATA[<p>@ Martin Richter<br />
Du hast recht. Der Befehl sollte</p>
<pre><code class="language-cpp">PostMessage(FindWindow(0,&quot;ZSNESWIN&quot;), WM_CLOSE,0,0)
</code></pre>
<p>lauten.</p>
<p>Dann wird das Fenster auch geschlossen. Mit TerminateApp2 sollten auch alle vestcken Fenster geschlossen werden. Ich frage mich nur, wieso die Exe weiterlaüft, obwohl an alle Fenster WM_CLOSE geschickt wurde.</p>
<p>Wie kann man per SendMessage ALT+F4 emulieren?</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1140851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1140851</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Wed, 20 Sep 2006 07:50:49 GMT</pubDate></item><item><title><![CDATA[Reply to Fremden Prozess beenden! on Wed, 20 Sep 2006 08:07:22 GMT]]></title><description><![CDATA[<p>Um Alt+F4 zu emulieren, scheint man mit</p>
<pre><code class="language-cpp">SendMessage(hwnd,WM_SYSCOMMAND,0x0000f060,0);
</code></pre>
<p>weiter zu kommen. Wie schon erwähnt, wird dann dass Fenster gesclossen aber die Anwendung läuft weiter.<br />
Bei der Anwendung handelt sich um eine DirectX Anwendung. Ich nehme an, dass wenn man das Fenster per Maus schließt, noch weitere Befehle ausgeführt werden, die mir nicht zugänglich sind.</p>
<p>Hat noch jemand eine Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1140865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1140865</guid><dc:creator><![CDATA[Mapp]]></dc:creator><pubDate>Wed, 20 Sep 2006 08:07:22 GMT</pubDate></item></channel></rss>