C++ 启动Mozilla Firefox时如何获取进程ID?

C++ 启动Mozilla Firefox时如何获取进程ID?,c++,winapi,pid,createprocess,C++,Winapi,Pid,Createprocess,获取我正在启动的进程的PID的任务,CreateProcess()ProcessInformation.dwProcessId在这方面做得很好,但是在我的例子中,我启动的进程打开子进程,然后关闭,我需要获取创建我正在打开的进程的所有PID 我发现这段代码,它接收子PID,但它们与最终的Firefox窗口不匹配,我做错了什么 资料来源: 更新1 在Drake Wu-MSFT评论之后,我使用了以下代码 int test(const wchar_t* programPath) { HANDL

获取我正在启动的进程的PID的任务,
CreateProcess()
ProcessInformation.dwProcessId
在这方面做得很好,但是在我的例子中,我启动的进程打开子进程,然后关闭,我需要获取创建我正在打开的进程的所有PID

我发现这段代码,它接收子PID,但它们与最终的Firefox窗口不匹配,我做错了什么

资料来源:

更新1 在Drake Wu-MSFT评论之后,我使用了以下代码

int test(const wchar_t* programPath) {
    HANDLE Job = CreateJobObject(nullptr, nullptr);
    if (!Job) {
        std::cout << "CreateJobObject, error " << GetLastError() << std::endl;
        return 0;
    }

    HANDLE IOPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 1);
    if (!IOPort) {
        std::cout << "CreateIoCompletionPort, error " << GetLastError() << std::endl;
        return 0;
    }

    JOBOBJECT_ASSOCIATE_COMPLETION_PORT Port;
    Port.CompletionKey = Job;
    Port.CompletionPort = IOPort;
    if (!SetInformationJobObject(Job,
        JobObjectAssociateCompletionPortInformation,
        &Port, sizeof(Port))) {
        std::cout << "SetInformation, error " << GetLastError() << std::endl;
        return 0;
    }

    PROCESS_INFORMATION ProcessInformation;
    STARTUPINFOW StartupInfo = { sizeof(StartupInfo) };
    LPWSTR szCmdline = const_cast<LPWSTR>(programPath);

    if (!CreateProcessW(
        programPath,
        nullptr,
        nullptr,
        nullptr,
        FALSE,
        CREATE_SUSPENDED,
        nullptr,
        nullptr,
        &StartupInfo,
        &ProcessInformation))
    {
        std::cout << "CreateProcess, error " << GetLastError() << std::endl;
        return 0;
    }
    std::cout << "PID: " << ProcessInformation.dwProcessId << std::endl;
    if (!AssignProcessToJobObject(Job, ProcessInformation.hProcess)) {
        std::cout << "Assign, error " << GetLastError() << std::endl;
        return 0;
    }

    ResumeThread(ProcessInformation.hThread);
    CloseHandle(ProcessInformation.hThread);
    CloseHandle(ProcessInformation.hProcess);

    DWORD CompletionCode;
    ULONG_PTR CompletionKey;
    LPOVERLAPPED Overlapped;
    while (GetQueuedCompletionStatus(IOPort, &CompletionCode, &CompletionKey, &Overlapped, INFINITE))
    {
        switch (CompletionCode)
        {
        case JOB_OBJECT_MSG_NEW_PROCESS:
            std::cout << "New PID: " << (int)Overlapped << std::endl;
            break;
        case JOB_OBJECT_MSG_EXIT_PROCESS:
            std::cout << "Exit PID: " << (int)Overlapped << std::endl;
            break;
        case JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:
            std::cout << "JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO" << std::endl;
            break;
        default:
            break;
        }
        if (CompletionCode == JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO)
            break;
    }
    std::cout << "All done" << std::endl;
}
int测试(常量wchar\u t*程序路径){
HANDLE Job=CreateJobObject(nullptr,nullptr);
如果(!作业){

std::cout我测试了Firefox的进程不是新的,并按顺序退出(通过
CreateProcess
获得的pid将退出),如果以后创建了任何新进程,您的代码将不会收到新的Firefox进程

您可以使用
swtich case
语句,为我提供以下示例:

int openProgram(const wchar_t* programPath) {
    HANDLE Job = CreateJobObject(nullptr, nullptr);
    if (!Job) {
        std::cout << "CreateJobObject, error " << GetLastError() << std::endl;
        return 0;
    }

    HANDLE IOPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, nullptr, 0, 1);
    if (!IOPort) {
        std::cout << "CreateIoCompletionPort, error " << GetLastError() << std::endl;
        return 0;
    }

    JOBOBJECT_ASSOCIATE_COMPLETION_PORT Port;
    Port.CompletionKey = Job;
    Port.CompletionPort = IOPort;
    if (!SetInformationJobObject(Job,
        JobObjectAssociateCompletionPortInformation,
        &Port, sizeof(Port))) {
        std::cout << "SetInformation, error " << GetLastError() << std::endl;
        return 0;
    }

    PROCESS_INFORMATION ProcessInformation;
    STARTUPINFO StartupInfo = { sizeof(StartupInfo) };
    LPTSTR szCmdline = _tcsdup(programPath);
    if (!CreateProcessW(
        nullptr,
        szCmdline,
        nullptr,
        nullptr,
        FALSE,
        CREATE_SUSPENDED,
        nullptr,
        nullptr,
        &StartupInfo,
        &ProcessInformation))
    {
        std::cout << "CreateProcess, error " << GetLastError() << std::endl;
        return 0;
    }
    std::cout << "PID: " << ProcessInformation.dwProcessId << std::endl;
    if (!AssignProcessToJobObject(Job, ProcessInformation.hProcess)) {
        std::cout << "Assign, error " << GetLastError() << std::endl;
        return 0;
    }

    ResumeThread(ProcessInformation.hThread);
    CloseHandle(ProcessInformation.hThread);
    CloseHandle(ProcessInformation.hProcess);

    DWORD CompletionCode;
    ULONG_PTR CompletionKey;
    LPOVERLAPPED Overlapped;
    while (GetQueuedCompletionStatus(IOPort, &CompletionCode, &CompletionKey, &Overlapped, INFINITE))
    {
        switch (CompletionCode)
        {
        case JOB_OBJECT_MSG_NEW_PROCESS:
            std::cout << "New PID: " << (int)Overlapped << std::endl;
            break;
        case JOB_OBJECT_MSG_EXIT_PROCESS:
            std::cout << "Exit PID: " << (int)Overlapped << std::endl;
            break;
        case JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO:
            std::cout << "JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO" << std::endl;
            break;
        default:
            break;
        }
        if (CompletionCode == JOB_OBJECT_MSG_ACTIVE_PROCESS_ZERO)
            break;
    }
    std::cout << "All done" << std::endl;
}
int openProgram(const wchar\u t*programPath){
HANDLE Job=CreateJobObject(nullptr,nullptr);
如果(!作业){
std::请看。