C++ 运行Windows程序并检测它何时以C++;

C++ 运行Windows程序并检测它何时以C++;,c++,windows,winapi,process,C++,Windows,Winapi,Process,假设我运行一个应用程序,一段时间后该应用程序将被用户关闭。有可能知道程序何时退出吗?运行该应用程序时,我可以获取其进程id吗?在Windows上,您可以使用它来实现此功能。在google的快速搜索中,我从msdn中找到了以下两种有用的方法: 和。这假设您正在应用程序中创建一个进程 您可以使用轮询方法检查创建的进程状态。我从来没有做过这种事,但对我来说似乎是一种非常奇怪的方式。这是一段引自: #包括 #包括 #包括 #包括 void _tmain(int argc,TCHAR*argv[]) {

假设我运行一个应用程序,一段时间后该应用程序将被用户关闭。有可能知道程序何时退出吗?运行该应用程序时,我可以获取其进程id吗?

在Windows上,您可以使用它来实现此功能。

在google的快速搜索中,我从msdn中找到了以下两种有用的方法:

和。这假设您正在应用程序中创建一个进程

您可以使用轮询方法检查创建的进程状态。我从来没有做过这种事,但对我来说似乎是一种非常奇怪的方式。

这是一段引自:

#包括
#包括
#包括
#包括
void _tmain(int argc,TCHAR*argv[])
{
STARTUPINFO si;
处理信息;
STARTUPINFO sj;
处理信息pj;
零内存(&si,sizeof(si));
si.cb=sizeof(si);
零内存(&pi,sizeof(pi));
零内存(&sj,sizeof(sj));
sj.cb=sizeof(sj);
零内存(&pj,sizeof(pj));
//启动子进程p1.exe。确保p1.exe位于
//与当前应用程序相同的文件夹。否则,在第一个参数中写入完整路径。
如果(!CreateProcess(L“\\p1.exe”、NULL、NULL、NULL、FALSE、0、NULL、NULL、&sj、&pj))
{
printf(“Hello CreateProcess失败(%d)\n”,GetLastError());
getch();
返回;
}
//启动子进程p2.exe。确保p2.exe位于
//与当前应用程序相同的文件夹。否则,在第一个参数中写入完整路径。
如果(!CreateProcess(L“\\p2.exe”、NULL、NULL、NULL、FALSE、0、NULL、NULL、si和pi))
{
printf(“CreateProcess2失败(%d)\n”,GetLastError());
getch();
返回;
}
//等待子进程退出。
WaitForSingleObject(pi.hProcess,无限);
WaitForSingleObject(pj.hProcess,无限);
//关闭进程和线程句柄。
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(pj.hProcess);
CloseHandle(pj.hThread);
getch();
}

CreateProcess和WaitForSingleObject是实现这一点的简单方法:从CreateProcess获取进程句柄,然后使用WFSO等待,不要忘记关闭任何使用的句柄。但是等等。。。有个问题。问题是,对于GUI进程,两个进程都可能挂起。为什么?

出现问题的原因是应用程序有一个窗口,但没有发送消息。如果生成的应用程序使用其中一个广播目标(
HWND_broadcast
HWND_TOPMOST
)调用SendMessage,则在所有应用程序处理完消息之前,SendMessage不会返回到新应用程序-但您的应用程序无法处理消息,因为它没有泵送消息。。。。所以新的应用程序会锁定,所以你的等待永远不会成功。。。。僵局

如果您对生成的应用程序拥有绝对控制权,则可以采取一些措施,例如使用SendMessageTimeout而不是SendMessage(例如,对于DDE启动,如果有人仍在使用该方法)。但有些情况会导致无法控制的隐式SendMessage广播,例如使用SetSysColors API


解决这一问题的唯一安全方法是(a)将等待分割为单独的线程,(b)在等待上使用超时,并在等待循环中使用PeekMessage以确保传递消息,(c)使用MsgWaitForMultipleObjects API而不是WaitForSingleObject。

提供更多控制的另一种方法是使用Win32作业API,见和。这将允许您使用IO完成端口异步监视生成的进程,因为它更复杂,可能比您需要的更复杂,但它确实让您能够更好地控制生成的进程。

我想说的是,您不必实际创建进程,就可以等待其终止。基本上,如果你知道它的PID,你可以这样做:

 HANDLE h = OpenProcess(SYNCHRONIZE, TRUE, pid);
 WaitForSingleObject(h, INFINITE );

完整示例:(如果希望提供编译版本,请在此处留下注释)。

至少在Windows上,有一些(未充分使用的?)C运行时库功能可用于此功能。 看

具体地说,您有
(\u p_WAIT,cmdname,arg0,…,argn,0)
(“spawn带有参数list,使用path变量来定位文件”),它在路径和当前目录中搜索cmdname。 请注意,“在argn之后,必须有一个空指针来标记参数列表的结尾。”

例如

#包括
#包括
int main(){
看跌期权(“等待”);
_spawnlp(_P_WAIT,“mspaint.exe”,“mspaint.exe”,0);
认沽权(“退还”);
}

你在说什么操作系统?你是如何运行这个过程的?是你的程序通过Excel、Fooor?Windows运行另一个进程,我想在C++应用程序中运行那个应用程序。谢谢有没有办法跟踪所创建进程的CPU、I/O使用情况和状态?看看这个问题,为什么不在进程运行期间使用GetExitCodeProcess()?这样,如果进程仍在运行,您将获得非常简单和方便的静止状态!
 HANDLE h = OpenProcess(SYNCHRONIZE, TRUE, pid);
 WaitForSingleObject(h, INFINITE );
#include <stdio.h>
#include <process.h>
int main() {
    puts("waiting");
    _spawnlp(_P_WAIT, "mspaint.exe", "mspaint.exe", 0);
    puts("returned");
}