gpt4 book ai didi

c++ - 为什么尽管有 SW_HIDE 和 CREATE_NO_WINDOW,通过 CreateProcess 调用的程序的窗口仍会显示?

转载 作者:行者123 更新时间:2023-11-28 00:42:56 24 4
gpt4 key购买 nike

我尝试从我的 exe 调用另一个程序,我希望它在后台静默执行。 (由于这个调用会很频繁,所以弹窗是不行的。)

可能的做法是这样的:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
ZeroMemory( &pi, sizeof(pi) );
if (!CreateProcess(NULL, cl, NULL, NULL, FALSE,
CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) return -1;
else
{
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
return 0;
}

进程已创建且所需程序运行,但不幸的是,尽管有 CREATE_NO_WINDOWSW_HIDE 标志,窗口仍会显示。我错过了什么/做错了什么吗?

我想我也许可以去做

  1. 通过GetProcessId从进程句柄获取进程ID
  2. 使用EnumWindowsGetWindowThreadProcessId 找到匹配的窗口
  3. 使用获取的HWND调用ShowWindowSW_HIDE

但这很麻烦,而且我认为 SW_HIDE 无论如何都应该在创建进程时“开箱即用”。

最佳答案

您在 wShowWindow 字段中提供的值被传递到新启动函数的 WinMain 入口点,但这只是建议性的 - 它完全取决于新的处理它是否显示它的窗口。

显示应用程序主窗口时的标准/推荐行为是调用 ShowWindow(hWnd, SW_SHOWNORMAL); 并且 SW_SHOWNORMAL 在这种情况下表示“使用传递的任何值到 WinMain"但同样,是否执行此操作取决于进程。

获得所需内容的一种方法是使用 WH_CBT Hook (请参阅 SetWindowsHookEx 的文档)。这将使您可以 Hook 窗口创建并将其重新定位到屏幕外或完全停止显示。

关于c++ - 为什么尽管有 SW_HIDE 和 CREATE_NO_WINDOW,通过 CreateProcess 调用的程序的窗口仍会显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17874418/

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