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

Why does the window of a program called via CreateProcess show up in spite of SW_HIDE and CREATE_NO_WINDOW?

本文关键字:HIDE SW INDOW NO CREATE 显示 CreateProcess 调用 窗口 程序 为什么      更新时间:2023-10-16

我试图从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. 使用获得的HWNDSW_HIDE调用ShowWindow

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

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

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

使用WH_CBT钩子(请参阅SetWindowsHookEx的文档)可以获得所需内容。这将允许您钩住窗口创建并将其重新定位到屏幕外,或者完全停止显示。

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