我尝试从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
用ShowWindow
调用SW_HIDE
但这很麻烦,无论如何,我认为
SW_HIDE
应该在创建流程时“开箱即用”地工作。 最佳答案
您在wShowWindow
字段中提供的值将传递到新启动的函数的WinMain
入口点,但这仅是建议性的-完全取决于新过程是否显示其窗口。
显示应用程序主窗口时的标准/建议行为是调用ShowWindow(hWnd, SW_SHOWNORMAL);
,在这种情况下,SW_SHOWNORMAL
表示“使用传递给WinMain
的任何值”,但这仍然取决于该过程。做这个。
一种获取所需内容的方法是使用WH_CBT
钩子(请参阅SetWindowsHookEx
文档)。这样一来,您就可以钩挂窗口创建并在屏幕外重新定位,或者完全停止显示窗口。
关于c++ - 尽管有SW_HIDE和CREATE_NO_WINDOW,为什么仍显示通过CreateProcess调用的程序窗口?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17874418/