5

我需要从任务栏中隐藏一个 Windows 窗体,但我不能使用WS_EX_TOOLWINDOW,因为我需要窗体标题栏上的系统菜单和最小/最大按钮。

如果我在运行时将表单切换到工具窗口,则会填充表单皮肤。通过在网上搜索,我看到 VB 有一个 ShowInTaskbar 属性,我想知道这是否可以满足我的要求,以及它是否可以在 Delphi 2006 中实现。此外,这个项目是一个 COM 服务器,没有 MainForm 等。

4

7 回答 7

7

感谢 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;
于 2008-11-04T13:56:58.427 回答
6

这里有一个关于这个确切问题的有趣讨论(从 VB6 的角度来看)。

从您的问题的角度来看,最相关的一点是:

“创建窗口时,任务栏会检查窗口的扩展样式,以查看是否打开了 WS_EX_APPWINDOW (&H40000) 或 WS_EX_TOOLWINDOW (&H80) 样式。如果打开了 WS_EX_APPWINDOW,则任务栏会显示窗口的按钮,如果WS_EX_ TOOLWINDOW 开启,任务栏不显示窗口的按钮。一个窗口不应该有这两种扩展样式。如果窗口没有这两种样式,任务栏决定创建一个按钮,如果窗口是无主的,如果窗口是拥有的,则不会创建按钮。"

顺便说一句,您可以使用带有 GW_OWNER 标志的 GetWindow API 函数来确定窗口是否拥有。

于 2008-11-04T11:55:51.637 回答
1

感谢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 一起工作。并且窗口菜单和最小/最大按钮仍然可见。

于 2008-11-04T11:50:12.927 回答
1

在 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;

这会有所帮助,我有同样的问题,搜索了整个网络但没有解决

于 2011-02-15T10:46:13.050 回答
0

通过 BordersStyle bsDialog/bsToolWindow 解决了我在这方面的问题(但后来我不需要最小/最大...)。但我想知道你为什么要结合这些属性。它不会让“普通”用户感到困惑吗?

于 2009-04-14T12:19:41.007 回答
0

我正在寻找一段将文本框集成到 Windows 任务栏的代码。

我计划创建一个我无法将其集成到任务栏的工具栏。

谢谢你的帮助pj

于 2015-05-29T08:13:43.320 回答
-1

在 C# 中执行此操作的一种方法是:

ShowWindow(_window, SWHide);

int style = GetWindowLong(_window, GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(_window, GWL_EXSTYLE, style);

ShowWindow(_window, SWShow);
于 2009-03-05T18:10:43.620 回答