我想创建一个重叠窗口,开始可见(因此任务栏按钮显示)但最小化。使用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
答案 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命令。