0

我尝试从我的 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. 通过从进程句柄中获取进程IDGetProcessId
  2. 使用EnumWindowsandGetWindowThreadProcessId查找匹配窗口
  3. 使用获得的HWND调用ShowWindowSW_HIDE

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

4

2 回答 2

6

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

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

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

于 2013-07-26T06:34:27.330 回答
-3

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

于 2013-07-26T09:22:16.507 回答