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);
如果要等待终止的进程在找到进程的进程iddwProcessId
之前启动,然后执行以下操作
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);
如果要等待终止的进程在找到进程的进程iddwProcessId
之前启动,然后执行以下操作
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){