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

时间:2011-10-01 18:14:38

标签: c++ c winapi

我想创建一个重叠窗口,开始可见(因此任务栏按钮显示)但最小化。使用WS_MINIMZED(或WS_MAXIMIZE)创建窗口不会执行任何操作。使用ShowWindow(hWnd,SW_SHOWMINIMIZED)会产生严重错误。我怀疑它与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

2 个答案:

答案 0 :(得分:0)

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

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

我在一个重复启动WinZip命令行版本的应用程序中使用了这种方法,并且工作正常。

答案 1 :(得分:0)

引用MSDN,函数ShowWindow,参数nCmdShow

  

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

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

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

  

如果在设置了WS_VISIBLE样式位并且x参数设置为CW_USEDEFAULT的情况下创建了重叠窗口,则y参数确定窗口的显示方式。如果y参数是CW_USEDEFAULT,则窗口管理器在创建窗口后使用SW_SHOW标志调用ShowWindow。如果y参数是某个其他值,则窗口管理器使用该值调用ShowWindow作为nCmdShow参数。

如果您隐藏(不使用WS_VISIBLE)和/或将{0}作为y的{​​{1}}参数创建窗口,可能会更好。

其他选项是首先创建一个虚拟窗口,显示它并快速销毁它,有些像闪屏。那会消耗STARTUPINFO命令。