【发布时间】: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_WINDOW 和 SW_HIDE 标志,窗口仍会显示。
我错过了什么/做错了什么?
我想我也许可以去
- 通过
GetProcessId从进程句柄中获取进程ID - 使用
EnumWindows和GetWindowThreadProcessId查找匹配窗口 - 使用获取到的
HWND调用ShowWindow和SW_HIDE
但这很麻烦,而且我认为SW_HIDE 在创建流程时应该“开箱即用”。
【问题讨论】:
-
我不确定,但我认为你告诉它隐藏只会影响
WinMain的第四个参数,程序可以随意使用或不使用它。 -
所以没有办法真正强制隐藏程序?
-
即使这么说我也觉得很糟糕,但如果你在不同的桌面上启动它,它可能在技术上有效(在找到窗口并在屏幕上闪烁时没有时间问题),这取决于它做。 必须有比这更干净的东西。
标签: c++ winapi visual-c++