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

时间:2013-07-26 06:30:20

标签: 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;
}

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

我发现我可能会去

  1. 通过GetProcessId
  2. 从流程句柄中获取流程ID
  3. 使用EnumWindowsGetWindowThreadProcessId查找匹配窗口
  4. 使用获得的HWNDShowWindow
  5. 联系SW_HIDE

    但这很麻烦,我认为SW_HIDE在创建流程时应该“开箱即用”。

2 个答案:

答案 0 :(得分:6)

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

显示应用主窗口时的标准/推荐行为是拨打ShowWindow(hWnd, SW_SHOWNORMAL);SW_SHOWNORMAL在此实例中意味着“使用传递给WinMain的任何值”但是,它再次出现关于它是否这样做的过程。

您可以通过WH_CBT挂钩获得所需内容的一种方式(请参阅SetWindowsHookEx的文档)。这将允许您挂钩窗口创建并将其重新定位在屏幕外或停止它完全显示。

答案 1 :(得分:-3)

使用CreateProcess +/- HCBT秘密启动应用程序的其他方式:window - >仅消息,窗口 - > WS_EX_LAYERED(alpha = 0),window - > NULLREGION,STATRTUPINFO.lpDesktop ...