我需要从任务栏中隐藏一个 Windows 窗体,但我不能使用WS_EX_TOOLWINDOW
,因为我需要窗体标题栏上的系统菜单和最小/最大按钮。
如果我在运行时将表单切换到工具窗口,则会填充表单皮肤。通过在网上搜索,我看到 VB 有一个 ShowInTaskbar 属性,我想知道这是否可以满足我的要求,以及它是否可以在 Delphi 2006 中实现。此外,这个项目是一个 COM 服务器,没有 MainForm 等。
感谢 Stu 让我这么快就得到了答案。在我的情况下,我必须手动将拥有表单的句柄添加到 CreateParams 中,但在其他/正常情况下可能不需要。
procedure TfrmWord2Site.CreateParams(var Params:TCreateParams);
begin
inherited CreateParams(Params);
Params.WndParent := <your owner form>.Handle;
Params.ExStyle := Params.ExStyle and not WS_EX_APPWINDOW;
end;
这里有一个关于这个确切问题的有趣讨论(从 VB6 的角度来看)。
从您的问题的角度来看,最相关的一点是:
“创建窗口时,任务栏会检查窗口的扩展样式,以查看是否打开了 WS_EX_APPWINDOW (&H40000) 或 WS_EX_TOOLWINDOW (&H80) 样式。如果打开了 WS_EX_APPWINDOW,则任务栏会显示窗口的按钮,如果WS_EX_ TOOLWINDOW 开启,任务栏不显示窗口的按钮。一个窗口不应该有这两种扩展样式。如果窗口没有这两种样式,任务栏决定创建一个按钮,如果窗口是无主的,如果窗口是拥有的,则不会创建按钮。"
顺便说一句,您可以使用带有 GW_OWNER 标志的 GetWindow API 函数来确定窗口是否拥有。
感谢http://www.scalabium.com/faq/dct0096.htm。
procedure TForm1.FormCreate(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE,
GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
ShowWindow(Application.Handle, SW_SHOW);
end;
我对其进行了测试,它与 Delphi2006 一起工作。并且窗口菜单和最小/最大按钮仍然可见。
在 Delphi XE (2010) 这完美地工作:你应该编辑主窗体,
program prog;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
begin
Application.Initialize;
// this value is set to "true", but you shoud set it "false"
Application.MainFormOnTaskbar := false;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
(在“建模视图”窗口中搜索此主表单)
在此之后,转到 unit1.pas,您的主要表单单元和 form1 的“OnShow”事件执行:
procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
这会有所帮助,我有同样的问题,搜索了整个网络但没有解决
通过 BordersStyle bsDialog/bsToolWindow 解决了我在这方面的问题(但后来我不需要最小/最大...)。但我想知道你为什么要结合这些属性。它不会让“普通”用户感到困惑吗?
我正在寻找一段将文本框集成到 Windows 任务栏的代码。
我计划创建一个我无法将其集成到任务栏的工具栏。
谢谢你的帮助pj
在 C# 中执行此操作的一种方法是:
ShowWindow(_window, SWHide);
int style = GetWindowLong(_window, GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(_window, GWL_EXSTYLE, style);
ShowWindow(_window, SWShow);