gpt4 book ai didi

c++ - Waitforsingleobject 在尝试打开 Notepad++ 时有效,但在 Firefox 中立即返回

转载 作者:行者123 更新时间:2023-11-27 22:39:25 26 4
gpt4 key购买 nike

我有以下代码,它使用 CreateProcess 打开一个应用程序并等待它几秒钟,然后在它没有关闭时将其关闭。例如,相同的代码在记事本++ 上可以正常工作,但当我尝试打开 Firefox.exe 时却不行

BOOL CALLBACK SendWMCloseMsg(HWND hwnd, LPARAM lParam)
{
//never gets called when opening Firefox.exe
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hwnd, &dwProcessId);
if (dwProcessId == lParam)
SendMessageTimeout(hwnd, WM_CLOSE, 0, 0, SMTO_ABORTIFHUNG, 30000, NULL);
return TRUE;
}


int main()
{
STARTUPINFO si;
PROCESS_INFORMATION pi;

memset(&si, 0, sizeof(si));
memset(&pi, 0, sizeof(pi));

si.cb = sizeof(si);

WCHAR szFilename[] = L"C:\\Program Files\\Mozilla Firefox\\firefox.exe";
if (CreateProcess(NULL,
szFilename,
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE,
NULL,
NULL,
&si,
&pi))
{
CloseHandle(pi.hThread);
WaitForInputIdle(pi.hProcess, INFINITE);

auto a = WaitForSingleObject(pi.hProcess, 30000);
if (a == WAIT_TIMEOUT)
{
EnumWindows(&SendWMCloseMsg, pi.dwProcessId);
if (WaitForSingleObject(pi.hProcess, INFINITE) == WAIT_TIMEOUT)
{
//never gets here.
TerminateProcess(pi.hProcess, 0);
}
}

//a vlaue is 0 and it never gets in the if statement.
CloseHandle(pi.hProcess);
}
return 0;
}

SendWMCloseMsg 没有被调用,当我删除 if 语句并调用 EnumWindows(&SendWMCloseMsg, pi.dwProcessId); 时,它仍然找不到正确的 processId。

我在这段代码中做错了什么以及如何解决这个问题?

我正在使用 Windows 10、64 位和 VS2015

最佳答案

答案是您使用 CreateProcess 启动的进程创建了一堆其他进程 - 然后退出。

您的 WaitForSingleObject 成功完成,您的程序结束。

关于c++ - Waitforsingleobject 在尝试打开 Notepad++ 时有效,但在 Firefox 中立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50327232/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com