2010-11-22 23 views
1

Ich möchte eine andere Anwendung "hören" und entscheiden, was zu tun ist, wenn es beendet wurde.Wie erhalte ich die Nachricht von einem anderen Prozess?

Wie?

Bearbeiten: Die beiden Programme werden auf demselben Computer ausgeführt, und ich möchte wissen, wenn ich das andere Programm schließe. Und dann mache Aktion in dem anderen Programm. Ich kann den anderen Programmcode nicht ändern. Ich kann die App B von App A aus starten oder nicht. Ich könnte die App B über ihren vollständigen Pfad zur EXE identifizieren.

+1

Sie sollten genauer definieren, welche Beziehung Ihre Anwendung A mit der Anwendung B hat, die Sie für die Beendigung überwachen möchten. Starten Sie die Anwendung B aus der Anwendung A beispielsweise in Bezug auf 'CreateProcess'? Wenn nicht, dann "Wie identifizierst du die Anwendung B: nach Dateiname, nach Windows-Titel und so weiter?". Ist Anwendung B beispielsweise eine GUI-Anwendung, eine Konsolenanwendung oder ein Windows-Dienst? Ich kann fortfahren ... Ihre aktuelle Frage kann auf vielfache Weise interpretiert werden. – Oleg

+0

Ich habe weitere Informationen hinzugefügt – Newbie

Antwort

4

WaitForSingleObject(hProcess, INFINITE);

+0

Wie bekomme ich den entsprechenden hProcess Wert? – Newbie

+0

Friert auch das mein Programm ein, bis das andere Programm beendet wird? – Newbie

+0

Wenn Sie nicht frieren mögen, dann könnten Sie in einem anderen Thread warten und sich eine Nachricht schreiben, wenn die Wartezeit endet. Oder verwenden Sie MsgWaitForMultipleObjects. –

0

Sie können nur die Prozessliste von OS in Abständen erhalten Sie wollen und entsprechende Maßnahmen ergreifen

+0

Ich hatte ein paar Probleme damit, also dachte ich mir einen einfacheren Weg – Newbie

5

Als Abyx schrieb, WaitForSingleObject (oder möglicherweise WaitForMulipleObjects) ist die API-Funktion Sie benötigen.

  1. Ereignisse erstellen
  2. Anfangen (Arbeiter) Faden
  3. Pass das Ereignis an den Thread Griff -> Handle1
  4. Lassen Sie sich für den Prozess behandeln zu beobachten. Siehe How can I get a process handle by its name in C++? -> HANDLE2
  5. In Thread-Funktionsaufruf WaitForMulipleObjects und für die beiden Griffe warten.
  6. Wenn HANDLE2 ausgelöst wird, tun Sie was Sie wollen ... und möglicherweise den Thread zu beenden.
  7. Wenn HANDLE1 ausgelöst wird, lassen Sie den Thread. Dies ist für eine ordnungsgemäße Beendigung Ihrer Anwendung: Bevor Sie den Haupt (GUI) -Thread beenden, legen Sie das Ereignis fest.
+0

Ich habe keine Ahnung, wie man Schritte 1-4 macht, was meinst du mit "feuert" in diesem Fall? um 7 meinst du, wenn mein Hauptprogramm beendet wird, muss ich den Thread, den ich erstellt habe, beenden? doesnt Windows behandelt das automatisch? – Newbie

+0

Was ich mit "Brände" meine, ist eine Änderung vom nicht signalisierten Zustand zum signalisierten Zustand. Siehe MSDN, "SetEvent" http://msdn.microsoft.com/en-us/library/ms686211(VS.85).aspx. –

+0

Ja, Windows wird Ihren Thread beenden, aber Sie müssen möglicherweise eine Bereinigung in Ihrem Thread durchführen (z. B. eine Protokolldatei schließen). Es ist eine Frage des Stils: Wenn Sie einen Thread erstellen, sollten Sie eine Möglichkeit haben, ihn zu beenden. –

1

Wenn Sie sich selbst beginnen, den Prozess für die Beendigung Sie warten wollen, zum Beispiel mit Bezug auf die Createprocess, ist das Warten auf den Prozess Ende sehr einfach

WaitForSingleObject(pi.hProcess, INFINITE); 

Wenn der Prozess, der Kündigung Sie warten wollen, gestartet wird, bevor Sie die Prozess-ID dwProcessId des Prozesses finden sollte, und dann gehen Sie wie folgt

HANDLE hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId); 
WaitForSingleObject(hProcess, INFINITE); 

die Durchsuchung des Prozess-ID in verschiedenen implementiert werden kann, w Sie hängen davon ab, welche Informationen Sie über den Prozess wissen und wie viele Instanzen des Prozesses gleichzeitig ausgeführt werden können. Wenn Sie beispielsweise den Dateinamen des derzeit laufenden Prozesses kennen, können Sie EnumProcesses, OpenProcess und GetProcessImageFileName verwenden. Hier ist der entsprechende Code in vereinfachter Form:

#include <Windows.h> 
#include <stdio.h> 
#include <tchar.h> 
#include <Psapi.h> 
#include <shlwapi.h> 

#pragma comment (lib, "Psapi.lib") 
#pragma comment (lib, "shlwapi.lib") 

int _tmain (int argc, LPCTSTR argv[]) 
{ 
    DWORD arProcessIds[1024], cbNeeded, i, dwStatus; 
    HANDLE hProcess = NULL; 
    LPCTSTR pszProcessName = NULL; 

    if (argc != 2) { 
     _tprintf (TEXT("USAGE:\n") 
        TEXT(" \"%s\" ExeName\n\n") 
        TEXT("Examples:\n") 
        TEXT(" \"%s\" TaskMgr.exe\n"), 
        argv[0], argv[0]); 
     return 1; // error 
    } 
    pszProcessName = argv[1]; 

    if (!EnumProcesses (arProcessIds, sizeof(arProcessIds), &cbNeeded)) { 
     // here shold be allocated array dynamically 
     return 1; // error 
    } 
    for (i = 0; i < cbNeeded/sizeof(DWORD); i++) { 
     if (arProcessIds[i] != 0) { 
      TCHAR szFileName[MAX_PATH]; 
      hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, arProcessIds[i]); 
      if (hProcess != NULL) { 
       dwStatus = GetProcessImageFileName (hProcess, szFileName, sizeof(szFileName)/sizeof(TCHAR)); 
       if (dwStatus > 0) { 
        LPCTSTR pszFileName = PathFindFileName (szFileName); 
        //_tprintf(TEXT("Process: %s\n"),szFileName); 
        if (StrCmpI(pszFileName, pszProcessName) == 0) { 
         break; 
        } 
       } 
       CloseHandle (hProcess); 
       hProcess = NULL; 
      } 
     } 
    } 
    //hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId); 
    if (hProcess == NULL) { 
     _tprintf(TEXT("The process \"%s\" is not found.\n"), pszProcessName); 
     return 1; 
    } 

    _tprintf(TEXT("Start waiting for the end of the process %s\n"), pszProcessName); 
    WaitForSingleObject(hProcess, INFINITE); 
    _tprintf(TEXT("The process is terminated")); 
    CloseHandle (hProcess); 

    return 0; 
} 
Verwandte Themen