代码之家  ›  专栏  ›  技术社区  ›  TheFuture1sNow

ShowWindow()无法最大化窗口的原因是什么?

  •  0
  • TheFuture1sNow  · 技术社区  · 5 月前

    我想在全屏模式下创建一个进程。我尝试在调用CreateProcess()时设置STARTUPINFO,如下所示:

    WCHAR cmd = L"Calc";
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    si.cb = sizeof(STARTUPINFO);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindows = SW_MAXIMIZE;
    // or si.dwFlags = STARTF_RUNFULLSCREEN;
    BOOL isCreated = CreateProcess(nullptr, cmd,
        nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
    

    但该过程并没有像预期的那样在全屏模式下启动。

    所以我在创建了这样的流程后试图获得它的HWND:

    HWND FindMainWindow(DWORD processId) {
        struct ProcHwnd {
            DWORD   process_id;
            HWND    hwnd;
        };
        ProcHwnd hProcWnd;
        auto EnumWindowCallback = [](HWND hwnd, LPARAM lParam) -> BOOL {
            ProcHwnd* data = reinterpret_cast<ProcHwnd *>(lParam);
            DWORD windowProcessID;
            GetWindowThreadProcessId(hwnd, &windowProcessID);
            if (windowProcessID == data->process_id) {
                if (IsWindowVisible(hwnd)) {
                    data->hwnd = hwnd;
                    return false;
                }
            }
            return true;
        };
        EnumWindows(EnumWindowCallback, reinterpret_cast<LPARAM>(&hProcWnd));
        return hProcWnd.hwnd;
    }
    
    int main() {
        WCHAR cmd = L"Calc";
        STARTUPINFO si;
        PROCESS_INFORMATION pi;
        ZeroMemory(&si, sizeof(STARTUPINFO));
        ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
        si.cb = sizeof(STARTUPINFO);
        BOOL isCreated = CreateProcess(nullptr, cmd,
            nullptr, nullptr, FALSE, 0, nullptr, nullptr, &si, &pi);
        WaitForInputIdle(pi.hProcess, INFINITE);
        HWND hWindow = FindMainWindow(pi.dwProcessId);
        if(hWindow == nullptr)
            return -1;
        ShowWindow(hWindow, SW_MAXIMIZE);
        return 0;
    }
    

    退出代码为0。但是 ShowWindow() 没有将窗口最大化。

    1 回复  |  直到 5 月前
        1
  •  0
  •   RbMm    5 月前

    在里面 FindMainWindow hProcWnd 未初始化和 EnumWindowCallback 没有设置任何标志,它实际上找到了窗口。从这些代码中可以知道结果 查找主窗口 是否真的找到了窗口。所以 if(hWindow == nullptr) 这里没有意义。 需要使用

    ProcHwnd hProcWnd {};
    

    calc.exe 在现代windows中,只需执行另一个进程( 计算器.exe )并退出而不创建任何窗口。所以你从堆栈或调试填充中得到了垃圾 0xcccccccccccccccc .无论如何,你的代码都无法与类似的应用程序一起使用 calc