在 ShellExecute 或 CreateProcess 上隐藏 DirectX9 游戏 window

Hide DirectX9 game window on ShellExecute or CreateProcess

我一直在尝试 ShellExecute 和 CreateProcess 来启动游戏 - 我的目标是隐藏游戏 window。该游戏是使用 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);

在这两种情况下,游戏都启动了,我得到的是全屏游戏。 我做错了什么吗?

STARTUPINFO.wShowWindow 标志在 WinMain 中作为最终参数 nCmdShow (https://msdn.microsoft.com/en-us/library/windows/desktop/ff381406(v=vs.85).aspx) 结束。不要求创建的进程遵守此请求。它可以自由创建任意数量的可见 windows。事实上,完全忽略这个标志是司空见惯的事情。如果你有正在启动的应用程序的源代码,并且可以重新编译它,你可以让它尊重这个请求。

此外,我还没有尝试过,但我认为尝试隐藏 DirectX 全屏 window 可能会失败,and/or 会导致问题。