打开一个程序并知道它是否打开
Open a programm and know if it is open
我想用 C++ 编写一个可以打开 .exe 程序的程序,并且我想知道它何时被用户关闭。我知道我可以通过这个代码打开一个程序:
system ("start C:\AAA.exe");
但是我不知道如何检查程序是否关闭。
On Windows 如果您使用 CreateProcess()
而不是 system()
来启动新进程。简化代码:
PROCESS_INFORMATION processInformation;
CreateProcess(..., &processInformation);
在 PPROCESS_INFORMATION
中找到它的句柄。使用它的句柄,您可以等待它终止(模仿 system()
的工作方式):
WaitForSingleObject(processInformation.hProcess, INFINITE);
或者如果您的代码必须 运行 与子进程一起使用,则定期检查其状态以获取其退出代码(如果有的话,另请参阅 How to determine if a Windows Process is running?):
DWORD exitCode;
BOOL isActive = STILL_ACTIVE == GetExitCodeProcess(processInformation.hProcess, &exitCode);
不要忘记关闭句柄(即使进程已经终止):
CloseHandle(processInformation.hProcess);
请注意,使用该代码您不知道进程终止的原因。可能是因为用户关闭了它的window,因为它自己终止了或者因为它崩溃了。对于 GUI 应用程序,您可以挂钩其主要 window 消息以查找 WM_CLOSE
(检测用户操作)、WM_QUIT
(应用程序执行)并使用 SetUnhandledExceptionFilter()
附加处理程序(检测未处理的错误)。这不是 100% 可靠,但对于另一个问题可能 material...
调用 system ("C:\AAA.exe");
您可以阻塞直到进程 AAA.exe 完成。
如果不能接受,可以在单独的线程中调用system ("C:\AAA.exe");
,检查是否完成。
#include <thread>
void threadRoutine()
{
::system("C:\AAA.exe");
}
int main()
{
std::thread systemCall(threadRoutine);
//do some work here
systemCall.join();
//you are sure that AAA.exe is finished
return 0;
}
我想用 C++ 编写一个可以打开 .exe 程序的程序,并且我想知道它何时被用户关闭。我知道我可以通过这个代码打开一个程序:
system ("start C:\AAA.exe");
但是我不知道如何检查程序是否关闭。
On Windows 如果您使用 CreateProcess()
而不是 system()
来启动新进程。简化代码:
PROCESS_INFORMATION processInformation;
CreateProcess(..., &processInformation);
在 PPROCESS_INFORMATION
中找到它的句柄。使用它的句柄,您可以等待它终止(模仿 system()
的工作方式):
WaitForSingleObject(processInformation.hProcess, INFINITE);
或者如果您的代码必须 运行 与子进程一起使用,则定期检查其状态以获取其退出代码(如果有的话,另请参阅 How to determine if a Windows Process is running?):
DWORD exitCode;
BOOL isActive = STILL_ACTIVE == GetExitCodeProcess(processInformation.hProcess, &exitCode);
不要忘记关闭句柄(即使进程已经终止):
CloseHandle(processInformation.hProcess);
请注意,使用该代码您不知道进程终止的原因。可能是因为用户关闭了它的window,因为它自己终止了或者因为它崩溃了。对于 GUI 应用程序,您可以挂钩其主要 window 消息以查找 WM_CLOSE
(检测用户操作)、WM_QUIT
(应用程序执行)并使用 SetUnhandledExceptionFilter()
附加处理程序(检测未处理的错误)。这不是 100% 可靠,但对于另一个问题可能 material...
调用 system ("C:\AAA.exe");
您可以阻塞直到进程 AAA.exe 完成。
如果不能接受,可以在单独的线程中调用system ("C:\AAA.exe");
,检查是否完成。
#include <thread>
void threadRoutine()
{
::system("C:\AAA.exe");
}
int main()
{
std::thread systemCall(threadRoutine);
//do some work here
systemCall.join();
//you are sure that AAA.exe is finished
return 0;
}