我想“听”其他一些应用程序,并决定在终止它时该怎么做。
如何?
编辑:这两个程序在同一台计算机上运行,我想知道何时关闭其他程序。然后在其他程序中执行操作。我无法修改其他程序代码。我可能会也可能不会从应用A启动应用B.我可以通过其完整路径识别应用B.
答案 0 :(得分:5)
正如Abyx所写,WaitForSingleObject
(或可能是WaitForMulipleObjects
)是您需要的API函数。
WaitForMulipleObjects
中等待两个句柄。答案 1 :(得分:4)
WaitForSingleObject(hProcess, INFINITE);
答案 2 :(得分:1)
如果你自己开始,你需要等待的终止进程,例如关于CreateProcess,等待进程结束非常简单
WaitForSingleObject(pi.hProcess, INFINITE);
如果您希望等待的终止进程在您找到进程的进程标识dwProcessId
之后启动,然后执行以下操作
HANDLE hProcess = OpenProcess (SYNCHRONIZE, FALSE, dwProcessId);
WaitForSingleObject(hProcess, INFINITE);
可以通过不同的方式实现对进程ID的搜索,具体取决于您了解有关进程的信息以及可以同时运行多少进程实例的知识。
例如,如果您知道当前正在运行的进程的文件名,则可以使用EnumProcesses
,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;
}
答案 3 :(得分:0)
您可以按照您想要的间隔从操作系统获取进程列表并采取适当的操作