我一直在尝试使用ShellExecute和CreateProcess来启动游戏 - 我的目标是隐藏游戏窗口。该游戏使用DirectX9构建。出于某种原因,我在这个问题上苦苦挣扎。我独立使用以下代码但没有成功
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = app_exe; // Path to game
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
使用CreateProcess
ZeroMemory(&procInfo, sizeof(PROCESS_INFORMATION));
ZeroMemory(&startupInfo, sizeof(STARTUPINFO));
startupInfo.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
startupInfo.hStdInput = GetStdHandle(STD_INPUT_HANDLE);
startupInfo.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
startupInfo.hStdError = GetStdHandle(STD_ERROR_HANDLE);
startupInfo.wShowWindow = SW_HIDE;
CreateProcess(app_exe, cmdline, NULL, NULL, FALSE,CREATE_NO_WINDOW , NULL, NULL,&startupInfo, &procInfo);
WaitForSingleObject(procInfo.hProcess, INFINITE);
在这两种情况下,游戏都会启动,我会得到一个全屏游戏。 我有什么不对的吗?
答案 0 :(得分:1)
STARTUPINFO.wShowWindow标志最终在WinMain中作为最终参数nCmdShow(https://msdn.microsoft.com/en-us/library/windows/desktop/ff381406(v=vs.85).aspx)。不要求创建的进程遵守此请求。可以随意创建尽可能多的可见窗口。事实上,完全忽略这个标志是司空见惯的。如果您有正在启动的应用程序的源代码,并且可以重新编译它,您可以使它尊重此请求。
此外,我还没有尝试过,但我认为尝试隐藏DirectX全屏窗口可能会失败,和/或导致问题。