创建最小化重叠窗口(Win32)

Creating a minimized overlapped window (Win32)

本文关键字:Win32 窗口 最小化 重叠 创建      更新时间:2023-10-16

我想创建一个重叠的窗口,开始可见(所以任务栏按钮显示),但最小化。用WS_MINIMZED(或WS_MAXIMIZE)创建窗口没有任何作用。使用ShowWindow(hWnd, sw_showminimize)会产生严重错误。我怀疑它与STARTUPINFO有关,但我找不到关于如何调整/更改/劫持它的任何信息。

hWnd = CreateWindowA(
    (LPCSTR)atom, 
    "Window Name", 
    WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_MINIMZED,    // doesn't work
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    CW_USEDEFAULT, 
    0, 
    0, 
    hInstance, 
    0);
ShowWindow(hWnd,SW_SHOWMINIMIZED);    // gives critical error

@Kaisha,你是对的:如果你使用CreateProcess启动可执行文件,那么窗口的可见性将受到STARTUPINFO的影响。要以最小化窗口的方式启动应用程序,请执行以下操作:

ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
startupInfo.dwFlags = STARTF_USESHOWWINDOW;
startupInfo.wShowWindow = SW_SHOWMINNOACTIVE;

我在一个反复启动WinZip命令行版本的应用程序中使用了这种方法,它工作得很好。

引用MSDN,函数ShowWindow,参数nCmdShow:

控制窗口的显示方式。如果启动该应用程序的程序提供了一个STARTUPINFO结构,则该参数在应用程序第一次调用ShowWindow时被忽略。

所以我猜你的窗口是由应用程序创建的第一个窗口,因此,ShowWindow的参数被忽略。

CreateWindow的文档中可以看到另一个鲜为人知的事实,参数y(是的,y):

如果使用WS_VISIBLE样式位设置创建了一个重叠窗口,并且x参数设置为CW_USEDEFAULT,则y参数决定窗口的显示方式。如果y参数是CW_USEDEFAULT,那么窗口管理器在创建窗口之后调用带有SW_SHOW标志的ShowWindow。如果y参数是其他值,那么窗口管理器将使用该值作为nCmdShow参数调用ShowWindow。

如果您创建隐藏窗口(没有WS_VISIBLE)和/或将0作为CreateWindowy参数,可能会更好。

其他选择是先创建一个虚拟窗口,显示它,然后快速销毁它,有些像一个闪屏。这将消耗STARTUPINFO命令。