在ShellExecute或CreateProcess上隐藏DirectX9游戏窗口

时间:2015-02-03 12:51:35

标签: visual-c++ window hide directx-9

我一直在尝试使用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);

在这两种情况下,游戏都会启动,我会得到一个全屏游戏。 我有什么不对的吗?

1 个答案:

答案 0 :(得分:1)

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

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