为什么通过CreateProcess调用的程序窗口会显示SW_HIDE和CREATE_NO_WINDOW?

Pix*_*ist 0 c++ winapi visual-c++

我尝试从我的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;
}
Run Code Online (Sandbox Code Playgroud)

在创建过程和所需的程序运行,但不幸的是,窗口尽管显示了CREATE_NO_WINDOWSW_HIDE标志.我错过了什么/做错了吗?

我发现我可能会去

  1. 从进程句柄中获取进程ID GetProcessId
  2. 使用EnumWindowsGetWindowThreadProcessId查找匹配窗口
  3. 使用所获得的HWND调用ShowWindowSW_HIDE

但这很麻烦,我认为SW_HIDE无论如何应该在创建过程时"开箱即用".

Jon*_*ter 6

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

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

你可以得到你想要的一种方法是使用WH_CBT钩子(参见文档SetWindowsHookEx).这将允许您挂钩窗口创建并将其重新定位到屏幕外或停止它完全显示.