我尝试从我的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
EnumWindows
和GetWindowThreadProcessId
查找匹配窗口HWND
与ShowWindow
SW_HIDE
醇>
但这很麻烦,我认为SW_HIDE
在创建流程时应该“开箱即用”。
答案 0 :(得分:6)
您在wShowWindow
字段中提供的值将传递到新启动的函数的WinMain
入口点,但它只是建议性的 - 它完全取决于新进程是否显示它的窗口与否。
显示应用主窗口时的标准/推荐行为是拨打ShowWindow(hWnd, SW_SHOWNORMAL);
,SW_SHOWNORMAL
在此实例中意味着“使用传递给WinMain
的任何值”但是,它再次出现关于它是否这样做的过程。
您可以通过WH_CBT
挂钩获得所需内容的一种方式(请参阅SetWindowsHookEx
的文档)。这将允许您挂钩窗口创建并将其重新定位在屏幕外或停止它完全显示。
答案 1 :(得分:-3)
使用CreateProcess +/- HCBT秘密启动应用程序的其他方式:window - >仅消息,窗口 - > WS_EX_LAYERED(alpha = 0),window - > NULLREGION,STATRTUPINFO.lpDesktop ...