如何将程序第二个窗体设为主窗体并使其最小化到任务栏?
解决主窗体最小化不显示在任务栏的问题
Windows仅会为顶级无父窗口且带有WS_EX_APPWINDOW扩展样式的窗口创建任务栏按钮。你的问题根源在于主窗体被识别为非顶级窗口(可能因ShowModal继承了登录窗体的父属性),导致Windows不将其判定为应用主窗口。
以下是两种可行的解决方法:
方法1:调整程序主窗体配置(推荐)
将主应用窗体设为程序的默认主窗体(在项目设置中切换主窗体为应用窗体),启动时先隐藏主窗体,再显示登录窗体:
- 在主窗体的
OnCreate事件中添加代码:procedure TMainForm.FormCreate(Sender: TObject); begin Hide; if LoginForm.ShowModal <> mrOk then begin Application.Terminate; Exit; end; Show; end; - 登录窗体验证通过时,设置
ModalResult := mrOk并关闭;验证失败则设置ModalResult := mrCancel,主窗体据此决定是否终止程序。
这种方式下主窗体是程序的顶级窗口,Windows会自动识别它为应用主窗口,最小化时正常显示在任务栏。
方法2:修改主窗体窗口样式(适配原有启动逻辑)
若必须保持登录窗体先启动、再ShowModal主窗体的逻辑,需手动调整主窗体的窗口属性:
在主窗体的OnCreate事件中添加代码:
procedure TMainForm.FormCreate(Sender: TObject); begin // 移除工具窗口样式,添加应用窗口样式 SetWindowLongPtr(Handle, GWL_EXSTYLE, (GetWindowLongPtr(Handle, GWL_EXSTYLE) and not WS_EX_TOOLWINDOW) or WS_EX_APPWINDOW); // 强制设置为顶级无父窗口 SetParent(Handle, 0); end;
关键注意事项
- 禁止将主窗体的
Parent属性设置为登录窗体,子窗口不会获得任务栏按钮。 - 确保主窗体的
FormStyle属性为fsNormal,避免使用fsMDIChild等非顶级窗体样式。
内容的提问来源于stack exchange,提问作者HeartWare
相关产品推荐
相关产品推荐

