在 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 会导致问题。
我一直在尝试 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 会导致问题。