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

时间:2010-11-22 12:39:06

标签: c++ windows visual-studio-2008 winapi

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

如何?

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

4 个答案:

答案 0 :(得分:5)

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

  1. 创建活动
  2. 启动(工作人员)主题
  3. 将事件句柄传递给线程 - >句柄1
  4. 获取要监视的进程的句柄。见How can I get a process handle by its name in C++? - > HANDLE2
  5. 在你的线程函数调用WaitForMulipleObjects中等待两个句柄。
  6. 如果HANDLE2触发,请执行您想要的任何操作......并可能终止该线程。
  7. 如果HANDLE1开火,请离开线程。这是为了优雅地终止您的应用程序:在退出主(GUI)线程之前,您可以设置事件。

答案 1 :(得分:4)

WaitForSingleObject(hProcess, INFINITE);

答案 2 :(得分:1)

如果你自己开始,你需要等待的终止进程,例如关于CreateProcess,等待进程结束非常简单

WaitForSingleObject(pi.hProcess, INFINITE);

如果您希望等待的终止进程在您找到进程的进程标识dwProcessId之后启动,然后执行以下操作

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

可以通过不同的方式实现对进程ID的搜索,具体取决于您了解有关进程的信息以及可以同时运行多少进程实例的知识。

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

#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;
}

答案 3 :(得分:0)

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