为什么通过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?
我试图从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_WINDOW
和SW_HIDE
标志,窗口仍会显示。我是不是错过了什么/做错了什么?
我想我可能会选择
- 通过
GetProcessId
从进程句柄获取进程id - 使用
EnumWindows
和GetWindowThreadProcessId
查找匹配窗口 - 使用获得的
HWND
用SW_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…
相关文章:
- Hide vtkOutputWindow
- CMake: Hide -WShadow global compile flag for child target
- "sw"在 FFMPEG 的 libswscale 中的含义是什么?
- 使用工厂时如何"hide"构造函数?
- 如何"hide"虚拟方法?(C++)
- 如何在头文件中"hide"变量?
- C++ ListView hide item
- 如何使用正则表达式正则表达式库表达程序集 lw/sw 指令
- 将sw - prolog连接到c++的问题
- 如何在Qt LineEdit上使用.hide,仍然需要输入
- 如何使用内联函数说明符"hide"私有成员函数?
- 在Qt中,在使用hide()或setVisible(false)时,如何阻止子网格布局试图将所有内容居中
- 在SW版本中添加新参数时如何处理"switch/case"