【问题标题】:Why does the window of a program called via CreateProcess show up in spite of SW_HIDE and CREATE_NO_WINDOW?尽管有 SW_HIDE 和 CREATE_NO_WINDOW,为什么通过 CreateProcess 调用的程序的窗口仍然显示?
【发布时间】:2013-07-26 17:22: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. 使用获取到的HWND调用ShowWindowSW_HIDE

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

【问题讨论】:

  • 我不确定,但我认为你告诉它隐藏只会影响WinMain 的第四个参数,程序可以随意使用或不使用它。
  • 所以没有办法真正强制隐藏程序?
  • 即使这么说我也觉得很糟糕,但如果你在不同的桌面上启动它,它可能在技术上有效(在找到窗口并在屏幕上闪烁时没有时间问题),这取决于它做。 必须有比这更干净的东西。

标签: c++ winapi visual-c++


【解决方案1】:

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

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

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

【讨论】:

  • 我忘记了 CBT 挂钩选项。可访问性也可以,并且不需要注入。
  • 我不认为 CBT 挂钩需要特别注入,您只需要将代码放在 DLL 中(即,如果确实需要注入,系统会为您处理)。
  • 我会看看这个。到目前为止谢谢!
  • @JonathanPotter,是的,这仍然有缺点。
  • 一般来说,仍然需要避免全局挂钩,尤其是在可访问性挂钩可以代替的情况下。
【解决方案2】:

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

【讨论】:

  • 我不知道这个答案想说什么。
  • 真的吗?您不想假设我可能不是一个白痴并改进您的答案以更清楚吗?你没有想到我可能不是唯一一个困惑的人吗?
  • 认为 kero 试图说有几种不同的方法可以在隐藏窗口的情况下启动应用程序。但是,其中只有2个可以和CreateProcess()一起使用,其中1个根本不适用于本次讨论,另外2个需要在CreateProcess()退出后手动定位窗口的HWND
  • @Remy Lebeau:“其中只有 2 个可以与 CreateProcess() 一起使用”-“真的”:) 吗?我旧的可行演示(截图):files.rsdn.ru/42164/runhidden.png
猜你喜欢
  • 2015-07-13
  • 2019-04-20
  • 2011-09-16
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多