<?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[WM_ENDSESSION für bestimmten Prozess]]></title><description><![CDATA[<p>Hi, ich hatte das Thema schon in einem anderen Thread, nur leider konnte ich mein Problem dort nicht lösen und hoffe nun noch auf den ein oder anderen Tip.</p>
<p>Mein Programm ( A ) startet mit CreateProzess ein zweites Programm ( B ).<br />
Daraufhin wartet ( A ) solange (WaitForSingleObject(pi.hProcess,INFINITE)) bis ( B ) geschlossen wird.</p>
<p>Problem :</p>
<p>Ich würde jetzt gerne beim runterfahren von Windows Programm ( B ) schliessen, damit auch ( A ) ordentlich geschlossen wird. Allerdings wird beim runterfahren zuerst ( A ) angesprochen, dadurch wird mein Programm unsauber geschlossen ( Windows macht es platt ).<br />
D.h. ich müsste OnEndSession irgendwie das richtige Prozesshandle übergeben, aber wie geht das ? Ich hab mich jetzt bestimmt eine Woche nur damit beschäftigt ohne eine Lösung zu finden.</p>
<p>Bitte helft mir, bin kurz vom durchdrehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/197555/wm_endsession-für-bestimmten-prozess</link><generator>RSS for Node</generator><lastBuildDate>Wed, 08 Apr 2026 13:07:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197555.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Nov 2007 06:24:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 06:24:05 GMT]]></title><description><![CDATA[<p>Hi, ich hatte das Thema schon in einem anderen Thread, nur leider konnte ich mein Problem dort nicht lösen und hoffe nun noch auf den ein oder anderen Tip.</p>
<p>Mein Programm ( A ) startet mit CreateProzess ein zweites Programm ( B ).<br />
Daraufhin wartet ( A ) solange (WaitForSingleObject(pi.hProcess,INFINITE)) bis ( B ) geschlossen wird.</p>
<p>Problem :</p>
<p>Ich würde jetzt gerne beim runterfahren von Windows Programm ( B ) schliessen, damit auch ( A ) ordentlich geschlossen wird. Allerdings wird beim runterfahren zuerst ( A ) angesprochen, dadurch wird mein Programm unsauber geschlossen ( Windows macht es platt ).<br />
D.h. ich müsste OnEndSession irgendwie das richtige Prozesshandle übergeben, aber wie geht das ? Ich hab mich jetzt bestimmt eine Woche nur damit beschäftigt ohne eine Lösung zu finden.</p>
<p>Bitte helft mir, bin kurz vom durchdrehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401688</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 06:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 07:10:10 GMT]]></title><description><![CDATA[<p>Die Antworten wurden Dir bereits in dem anderem Thread gegeben.</p>
<p>1. Du benötigst eine MessageLoop und ein Fenster, dass die Meldng WM_ENDSESSION entgegen nimmt.<br />
2. Du darfst eben nicht WaitForSingleObject verwenden sondern MsgWaitForMultipleObjects und Du musst die Message Loop auch weiter laufen lassen.<br />
3. Ich hoffe, dass Dein Prozess B auch WM_ENDSESSION mitbekommt oder zumidnest einen Handler hat, der mit SetConsoleCtrlHandler gesetzt wurde.<br />
4. Hast Du uns nicht verarten, was für eine Art von Programm A+B sind (UI, Console, oder gar etwas, DLL in einem anderen Prozess...)</p>
<p>An Deinen weiteren Fragen habe ich germekt, dass Dir viele Grundlagen fehlen. Beschäftige Dich erstmal damit was eine MessageLoop ist und wie diese funktioniert... Dan wird der der rest auch aufgehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401698</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 12 Nov 2007 07:10:10 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 07:55:42 GMT]]></title><description><![CDATA[<p>Hi, also ich hab mich bereits ziemlich intensiv mit dem Thema &quot;Nachrichtenschleife&quot; beschäftigt, und hab das nun so gemacht :</p>
<pre><code class="language-cpp">HANDLE hEvents[1];
hEvents[0] = pi.hProcess;

dwWaitResult = MsgWaitForMultipleObjects(1,hEvents,TRUE,INFINITE,QS_ALLINPUT);

switch (dwWaitResult) 
    {

        case WM_ENDSESSION :
			AfxMessageBox(&quot;Alle Programme schliessen bitte!&quot;);
			break;

	case WAIT_OBJECT_0: 

                        strUhr = m_sTime;
			strDate = m_sDate;

			ShowWindow(SW_RESTORE);

			SetTimer(ID_COUNT_TIMER2, 1,NULL);
                       break; 

		default: 
            AfxMessageBox(&quot;FEHLER!!!!&quot;); 
	        ExitProcess(0); 
			break;
   }
</code></pre>
<p>Die beiden Programm sind lediglich .exe Programme(wie notepad,paint usw.).</p>
<p>zu Punkt 3 :</p>
<p>Genau das ist das Problem, Programm B bekommt WM_ENDSESSION nicht mit und ich weiss nicht wie ich eben mein Prozesshandle von B an WM_ENDSESSION übergebe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401716</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 07:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 07:58:52 GMT]]></title><description><![CDATA[<p>Du verstehst es nicht. MsgWaitForMultipleObjects liefert niemals WM_ENDSESSION zurück!</p>
<p>Wenn Du Dich mit dem Thema Nachrichtenschleife beschäftigt hast, dann Frage ich mich gerade wo diese ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401717</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401717</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 12 Nov 2007 07:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 08:10:29 GMT]]></title><description><![CDATA[<p>Ja die eigentliche Nachrichtenschleife ist doch in der WinMain, die eben versteckt ist ( also hab ich doch darauf gar keinen Zugriff, oder doch ? ). Zumindest hab ich das auf zig verschiedenen Seiten so gelesen...</p>
<p>Ok wenn du Konstruktion unten nicht funktioniert, dann weiss ich es auch nicht wie es gehen soll. Sry , für mich ist das ein logischer Aufbau...wird mir wohl nix anderes übrig bleiben als weiterzusuchen... <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="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401720</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 08:10:29 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 08:51:53 GMT]]></title><description><![CDATA[<p>Ja, die Nachrichtenschleife ist irgendwo in der WinMain() - wenn du mit MFC arbeitest, kannst du dir irgendwo einen Handler für die Nachricht anlegen und mit ON_MESSAGE() in die Message-Map einfügen (lassen). Dann sieht das System ungefähr so aus:</p>
<pre><code class="language-cpp">//Event zur Benachrichtigung des Arbeitsthreads (in der Hauptklasse App oder View)
CEvent m_evt;

//Bei Start des Programms
AfxBeginThread(thrdFunc,this);

//Thread-Funktion
static UINT thrdFunc(LPVOID pParam)
{
  CMyView* pMain = (CMyView*)pParam; //evt auch CMyApp - je nachdem wer AfxBeginThread() aufgerufen hat
  PROCESS_INFORMATION pi;
  ...
  CreateProcess(&amp;pi);
  HANDLE objects[2]={pi.hProcess,pMain-&gt;m_evt};
  switch(WaitForMultipleObjects(2,objects,FALSE,INFINITE))
  {
  case WAIT_OBJECT_0:
    //Zielprogramm beendet
  case WAIT_OBJECT_0+1:
    //Abbruch aus Hauptprogramm
  default:
    //hier ist was schiefgegangen
  }
  return 0;
}

//Behandlung WM_ENDSESSION
LRESULT OnEnsSession(WPARAM w,LPARAM l)
{
  m_evt.SetEvent();//Abbruchsignal für Thread
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1401736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401736</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 12 Nov 2007 08:51:53 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 09:13:33 GMT]]></title><description><![CDATA[<p>Hmmm die Sache ist mit Threads kenn ich mich wieder gar nicht aus...aber trotzdem Danke für die Mühe.<br />
Du meinst praktisch einen Thread erstellen ( also ne neue Klasse usw. ) wäre die einfachste Lösung ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401738</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 09:13:33 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 09:55:15 GMT]]></title><description><![CDATA[<p>Sicher ist die MessageLoop in der WinMain irgendwo, bzw. in der MFC vergraben. Also was macht man:</p>
<p>1. Man disabled das eigene Main Window um weitere Input-Events zu verhindern.<br />
2. Man startet das fremde Programm per CreateProcess/SehlleExcuteEx und merkt sich das Prozess Handle.<br />
3a. Nach dem Start returniert man. Man überschreibt z.B. CWinApp::OnIdle um dort mit MsgWaitForMultipleObjects zu warten, bzw. weiter zu arbeiten.<br />
3.b. Baut seine eigene MessageLoop, die nach dem Start mit PumpMessage Nachrichten zieht und verabeitet und zwischendrin mal mit MsgWaitForMultipleObjects darauf wartet, dass der Prozess fertig wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401750</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 12 Nov 2007 09:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 12:00:26 GMT]]></title><description><![CDATA[<p>Beim Versuch den Thread zu erstellen bekomme ich lauter Errors, also meine ganzen Variablen innerhalb des Threads werden nicht mehr erkannt...</p>
<p>...und wo muss ich das Event &quot;CEvent m_evt&quot; eintragen ? Ich krieg da irgendwie überall Fehler ( egal wo ichs eintrag ) : 'CEvent': nichtdeklarierter Bezeichner .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401800</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 12:00:26 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 12:11:28 GMT]]></title><description><![CDATA[<p>Zeig doch mal ein Beispiel, wie du das gemacht hast. Der Event sollte ein Member deiner App-Klasse sein, die Thread-Funktion eine <strong>statische</strong> Methode der App-Klasse (und weil du in einer statischen Methode keinen this-Zeiger hast, mußt du über &quot;CMyApp* pThis=(CMyApp*)pParam;&quot; auf deine Member zugreifen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401804</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 12 Nov 2007 12:11:28 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 12:25:27 GMT]]></title><description><![CDATA[<p>Also das soll der Thread sein :</p>
<pre><code class="language-cpp">UINT CTimerDlg::thrdFunc(LPVOID pParam)
{

STARTUPINFO si = {sizeof(si)};
	PROCESS_INFORMATION pi = {0};

	si.wShowWindow = SW_NORMAL;

	ZeroMemory( &amp;si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &amp;pi, sizeof(pi) );

	if(!CreateProcess( NULL,   
        CmdLineLPSTR,
		NULL,          
        NULL,           
        FALSE,          
        0,            
        NULL,          
        NULL,         
        &amp;si,           
        &amp;pi )  

		)

	{
        MessageBox(&quot;Fehler&quot;);
        return 0;
    }

  ShowWindow(SW_HIDE);

HANDLE hEvents[1];
hEvents[0] = pi.hProcess;

dwWaitResult = MsgWaitForMultipleObjects(1,hEvents,TRUE,INFINITE,QS_ALLINPUT);

switch (dwWaitResult)
    {
        case WAIT_OBJECT_0:

                        strUhr = m_sTime;
            strDate = m_sDate;

            ShowWindow(SW_RESTORE);

            SetTimer(ID_COUNT_TIMER2, 1,NULL);
                       break;

        default:
            AfxMessageBox(&quot;FEHLER!!!!&quot;);
            ExitProcess(0);
            break;
   }

	return 0;
}
</code></pre>
<p>Und so sieht die Funktion aus wo vorher der CreateProcess() drin stand :</p>
<pre><code class="language-cpp">void CTimerDlg::OnBnClickedButton1()
{

	m_Start.EnableWindow(FALSE);
	m_Ende.EnableWindow(TRUE);
	m_Verz.EnableWindow(FALSE);

	CString strVerzeichnis, strProc, strSpeicher;

	GetDlgItemText(IDC_EDIT1, strVerzeichnis);
	GetDlgItemText(IDC_EDIT2, strProc);
	GetDlgItemText(IDC_EDIT3, strSpeicher);

	if(GetDlgItemText(IDC_EDIT1, m_Verzedit) == NULL)
	{

		CmdLineLPSTR = T2A(m_openpath.GetBuffer(m_openpath.GetLength()));
	}

	else
	{

		m_SpeicherOrt = strSpeicher;
		m_proc2 = strProc;
		m_Verzedit = strVerzeichnis;

		CmdLineLPSTR = T2A(strVerzeichnis.GetBuffer(strVerzeichnis.GetLength()));

	}

	AfxBeginThread(thrdFunc ,this); 

}
</code></pre>
<p>Und in der .h steht : EDIT : sry header nict .cpp</p>
<pre><code class="language-cpp">...
protected:
	HICON m_hIcon;
	CEvent m_evt;

...
</code></pre>
<p>Bekomme 19 Fehler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401806</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 12:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 12:45:47 GMT]]></title><description><![CDATA[<p>Wo (und wie) hast du eigentlich &quot;CmdLineLPTSTR&quot; definiert? Wenn das ein Member der App-Klasse ist, hast du zwei Probleme: Erstens mußt du dem Compiler sagen, wessen Member du benötigst (siehe oben: pThis-&gt;CmdLineLPTSTR) und zweitens könnte T2A dort ein paar Probleme verursachen (das holt sich seinen Speicher im Ernstfall per alloca(), da werden die Daten ungültig, bevor du etwas damit anfangen kannst.</p>
<p>PS: Und MsgWaitForMultipleObjects() wacht auf bei der ersten WM_... Nachricht, die dein Programm übergeben bekommt. Wenn du das nutzt, brauchst du (vermutlich) keinen Thread - mußt aber wieder zurückkehren zum Warte-Modus, wenn dort die falsche Nachricht gekommen ist. Besser ist's, du überlässt dem Hauptthread die Nachrichtenverarbeitung und lässt dich über einen Event (und die &quot;klassische&quot; WaitForMultipleObjects()) informieren, wenn Windows sich beenden will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401817</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 12 Nov 2007 12:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 12:51:15 GMT]]></title><description><![CDATA[<p>Ja es ist eine Membervariable in der .cpp *heul*</p>
<p>Also meinst du ich sollte das so lassen wie ichs hatte ( hab ja ne Sicherung ) und dann mit WaitForMultipleObjects() ?</p>
<p>Aber hab ich dann nicht wieder dasselbe Problem wie vorher, das bei WM_ENDSESSION nur der Hauptprozess reagiert ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401819</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 12:51:15 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 12:56:49 GMT]]></title><description><![CDATA[<p>Dann nochmal langsam zum Mitschreiben - du übergibst der Funktion dein App-Objekt als pParam - darüber kannst du auch auf dessen Member zugreifen (ich glaub', ich hab' ne Schallplatte verschluckt).</p>
<p>(und wieso verwendest du überhaupt &quot;T2A()&quot;? CreateProcess verlangt doch genauso wie der Rest der WinAPI-Funktionen einen TCHAR*)</p>
<blockquote>
<p>Aber hab ich dann nicht wieder dasselbe Problem wie vorher, das bei WM_ENDSESSION nur der Hauptprozess reagiert ?</p>
</blockquote>
<p>Es reicht doch, wenn der Hauptprozess (bzw. dessen Hauptthread) darauf reagiert - dieser setzt einen Event, um den Überwachungs-Thread abzubrechen.<br />
(und der überwachte Prozess wird schon selber auf WM_ENDSESSION reagieren, wenn er an der Reihe ist)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401825</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 12 Nov 2007 12:56:49 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Mon, 12 Nov 2007 13:01:19 GMT]]></title><description><![CDATA[<p>Ja ok ok ich versuchs mal, tut mir Leid wenn ich dich so Stresse aber bin kurz vorm Kollaps</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1401829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1401829</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Mon, 12 Nov 2007 13:01:19 GMT</pubDate></item><item><title><![CDATA[Reply to WM_ENDSESSION für bestimmten Prozess on Tue, 13 Nov 2007 11:32:39 GMT]]></title><description><![CDATA[<p>Habs endlich hinbekommen, aber ohne deine Hilfe wahrscheinlich nicht, danke Mr.Stoll und danke auch für die Geduld</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1402401</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1402401</guid><dc:creator><![CDATA[toxor]]></dc:creator><pubDate>Tue, 13 Nov 2007 11:32:39 GMT</pubDate></item></channel></rss>