C++ 如何从另一个进程捕获退出消息?

C++ 如何从另一个进程捕获退出消息?,c++,windows,visual-studio-2008,winapi,C++,Windows,Visual Studio 2008,Winapi,我想“听”一些其他的应用程序,并决定当它被终止时该怎么做 怎么做 编辑:这两个程序在同一台计算机上运行,我想知道何时关闭另一个程序。然后在另一个程序中执行操作。我不能修改其他程序代码。我可以从应用程序A启动应用程序B,也可以不启动。我可以通过应用程序B到exe的完整路径来识别应用程序B。WaitForSingleObject(HPProcess,INFINITE)WaitForSingleObject(HPProcess,无限)您可以按照您想要的时间间隔从操作系统获取流程列表并采取适当的操作您可

我想“听”一些其他的应用程序,并决定当它被终止时该怎么做

怎么做


编辑:这两个程序在同一台计算机上运行,我想知道何时关闭另一个程序。然后在另一个程序中执行操作。我不能修改其他程序代码。我可以从应用程序A启动应用程序B,也可以不启动。我可以通过应用程序B到exe的完整路径来识别应用程序B。

WaitForSingleObject(HPProcess,INFINITE)

WaitForSingleObject(HPProcess,无限)

您可以按照您想要的时间间隔从操作系统获取流程列表并采取适当的操作

您可以按照您想要的时间间隔从操作系统获取流程列表并采取适当的操作

正如Abyx所写,
WaitForSingleObject
(或者可能是
WaitForMulipleObjects
)是您需要的API函数

  • 创建一个事件
  • 启动(辅助)线程
  • 将事件句柄传递给线程->句柄1
  • 获取要监视的进程的句柄。参见->手柄2
  • 在线程函数中调用
    WaitForMulipleObjects
    并等待两个句柄
  • 如果HANDLE2开火,做你想做的任何动作。。。并可能终止线程
  • 如果HANDLE1触发,请保留线程。这是为了优雅地终止应用程序:在退出主(GUI)线程之前,设置事件

  • 正如Abyx所写,
    WaitForSingleObject
    (或者可能是
    WaitForMulipleObjects
    )是您需要的API函数

  • 创建一个事件
  • 启动(辅助)线程
  • 将事件句柄传递给线程->句柄1
  • 获取要监视的进程的句柄。参见->手柄2
  • 在线程函数中调用
    WaitForMulipleObjects
    并等待两个句柄
  • 如果HANDLE2开火,做你想做的任何动作。。。并可能终止线程
  • 如果HANDLE1触发,请保留线程。这是为了优雅地终止应用程序:在退出主(GUI)线程之前,设置事件

  • 如果您自己启动,那么您希望等待终止的进程,例如关于CreateProcess,等待进程结束是非常简单的

    WaitForSingleObject(pi.hProcess, INFINITE);
    
    如果要等待终止的进程在找到进程的进程id
    dwProcessId
    之前启动,然后执行以下操作

    HANDLE hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId);
    WaitForSingleObject(hProcess, INFINITE);
    
    进程id的搜索可以以不同的方式实现,这取决于您知道关于进程的哪些信息以及知道可以同时运行多少个进程实例

    例如,如果您知道当前正在运行的进程的文件名,则可以使用
    enumprocess
    OpenProcess
    GetProcessImageFileName
    。以下是简化形式的相应代码:

    #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;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #pragma注释(lib,“Psapi.lib”)
    #pragma注释(lib,“shlwapi.lib”)
    int_tmain(int argc,LPCTSTR argv[])
    {
    DWORD arProcessIds[1024],需要CBI,dwStatus;
    HANDLE hProcess=NULL;
    LPCTSTR pszProcessName=NULL;
    如果(argc!=2){
    _tprintf(文本(“用法:\n”)
    文本(“\%s\”ExeName\n\n”)
    文本(“示例:\n”)
    文本(“\%s\”TaskMgr.exe\n”),
    argv[0],argv[0]);
    返回1;//错误
    }
    pszProcessName=argv[1];
    if(!EnumProcesses(需要arProcessIds、sizeof(arProcessIds)和CBD)){
    //这里应该动态地分配数组
    返回1;//错误
    }
    对于(i=0;i0){
    LPCTSTR pszFileName=PathFindFileName(szFileName);
    //_tprintf(文本(“进程:%s\n”),szFileName);
    if(StrCmpI(pszFileName,pszProcessName)==0){
    打破
    }
    }
    CloseHandle(hProcess);
    hProcess=NULL;
    }
    }
    }
    //hProcess=OpenProcess(同步,FALSE,dwProcessId);
    if(hProcess==NULL){
    _tprintf(TEXT(“找不到进程\%s\”)、pszProcessName);
    返回1;
    }
    _tprintf(TEXT(“开始等待进程%s的结束”)、pszProcessName;
    WaitForSingleObject(hProcess,无限);
    _tprintf(文本(“进程终止”);
    CloseHandle(hProcess);
    返回0;
    }
    
    如果您自己启动,您希望等待终止的流程,例如对于CreateProcess,等待流程结束非常简单

    WaitForSingleObject(pi.hProcess, INFINITE);
    
    如果要等待终止的进程在找到进程的进程id
    dwProcessId
    之前启动,然后执行以下操作

    HANDLE hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId);
    WaitForSingleObject(hProcess, INFINITE);
    
    进程id的搜索可以以不同的方式实现,这取决于您知道关于进程的哪些信息以及知道可以同时运行多少个进程实例

    例如,如果您知道当前正在运行的进程的文件名,则可以使用
    enumprocess
    OpenProcess
    GetProcessImageFileName
    。以下是简化形式的相应代码:

    #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;
    }
    
    #包括
    #包括
    #包括
    #包括
    #包括
    #pragma注释(lib,“Psapi.lib”)
    #pragma注释(lib,“shlwapi.lib”)
    int_tmain(int argc,LPCTSTR argv[])
    {
    DWORD arProcessIds[1024],需要CBI,dwStatus;
    HANDLE hProcess=NULL;
    LPCTSTR pszProcessName=NULL;
    如果(argc!=2){