为何ShowWindow()无法最大化窗口?创建全屏进程失败求助
一、初始CreateProcess设置STARTUPINFO无效的原因
类型错误导致参数异常
代码中WCHAR cmd = L"Calc";存在严重错误:单个WCHAR仅能存储一个宽字符,无法容纳完整字符串,这会导致CreateProcess接收到的命令行参数失效。正确写法应为:WCHAR cmd[] = L"calc.exe";STARTF_RUNFULLSCREEN仅支持控制台程序
该标志是专门为控制台程序设计的,GUI程序(如计算器)不会响应此设置,因此完全无效。现代GUI程序自行管理窗口状态
Win10/11默认的计算器属于UWP/WinUI应用,这类程序会优先使用自身保存的窗口配置(比如恢复上次关闭时的大小位置),启动时会忽略STARTUPINFO中的SW_MAXIMIZE参数。
二、创建进程后调用ShowWindow无效的原因
UWP应用的窗口归属问题
Win10/11的计算器窗口实际由ApplicationFrameHost.exe进程托管,而非calc.exe进程。你通过pi.dwProcessId查找窗口时,根本找不到目标HWND——即使FindMainWindow返回非空值,也大概率是无关窗口。窗口查找逻辑存在缺陷
EnumWindows仅返回第一个可见的匹配进程ID的窗口,但该窗口不一定是程序的主窗口(可能是弹窗、辅助窗口)。WaitForInputIdle只能确保进程进入空闲状态,无法保证窗口已经完全创建并注册到系统,可能出现窗口未就绪就执行查找的情况。
程序自身覆盖窗口状态
即使找到正确的HWND并调用ShowWindow(SW_MAXIMIZE),部分程序会在窗口初始化完成后再次调整状态,覆盖你的设置。
三、可行的解决方案
1. 修正基础代码错误
先修复命令行参数的类型问题:
WCHAR cmd[] = L"calc.exe";
2. 改进Win32程序的窗口查找逻辑
如果目标是传统Win32程序,优化FindMainWindow函数,确保找到真正的主窗口:
HWND FindMainWindow(DWORD processId) { struct ProcHwnd { DWORD process_id; HWND hwnd; }; ProcHwnd hProcWnd = {processId, nullptr}; auto EnumWindowCallback = [](HWND hwnd, LPARAM lParam) -> BOOL { ProcHwnd* data = reinterpret_cast<ProcHwnd*>(lParam); DWORD windowProcessID; GetWindowThreadProcessId(hwnd, &windowProcessID); // 匹配进程ID + 顶层窗口 + 可见 + 非工具窗口 if (windowProcessID == data->process_id && GetParent(hwnd) == nullptr && IsWindowVisible(hwnd)) { LONG exStyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE); if (!(exStyle & WS_EX_TOOLWINDOW)) { data->hwnd = hwnd; return FALSE; } } return TRUE; }; // 增加重试逻辑,等待窗口创建 for (int i = 0; i < 10; ++i) { EnumWindows(EnumWindowCallback, reinterpret_cast<LPARAM>(&hProcWnd)); if (hProcWnd.hwnd != nullptr) break; Sleep(200); } return hProcWnd.hwnd; }
3. 强制最大化的替代方法
使用WM_SYSCOMMAND发送最大化命令,部分程序对该消息的响应优先级更高:
if (hWindow != nullptr) { SendMessage(hWindow, WM_SYSCOMMAND, SC_MAXIMIZE, 0); ShowWindow(hWindow, SW_SHOWMAXIMIZED); }
4. UWP应用的特殊处理
针对UWP应用,无法通过进程ID直接找到窗口,可尝试通过窗口标题查找(注意标题可能随系统语言变化):
HWND hWindow = FindWindow(nullptr, L"计算器"); if (hWindow != nullptr) { SendMessage(hWindow, WM_SYSCOMMAND, SC_MAXIMIZE, 0); }
内容的提问来源于stack exchange,提问作者TheFuture1sNow

