我尝试从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标志,该窗口仍然显示。
我错过了什么/做错了什么吗?

我发现我也许可以去


通过GetProcessId从进程句柄获取进程ID
使用EnumWindowsGetWindowThreadProcessId查找匹配的窗口
使用获得的HWNDShowWindow调用SW_HIDE


但这很麻烦,无论如何,我认为SW_HIDE应该在创建流程时“开箱即用”地工作。

最佳答案

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

显示应用程序主窗口时的标准/建议行为是调用ShowWindow(hWnd, SW_SHOWNORMAL);,在这种情况下,SW_SHOWNORMAL表示“使用传递给WinMain的任何值”,但这仍然取决于该过程。做这个。

一种获取所需内容的方法是使用WH_CBT钩子(请参阅SetWindowsHookEx文档)。这样一来,您就可以钩挂窗口创建并在屏幕外重新定位,或者完全停止显示窗口。

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

10-11 22:42
查看更多