不使用WS_EX_TOOLWIN隐藏表单的任务栏按钮

时间:2008-11-04 11:37:36

标签: vb.net delphi button taskbar

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

如果我在运行时将表单切换到工具窗口,表单外观会被填满。从Web上搜索,我看到VB有一个ShowInTaskbar属性,我想知道这是否能做我想要的,以及它是否可以在Delphi 2006中实现。此项目也是一个COM服务器,没有MainForm等。

7 个答案:

答案 0 :(得分: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;

答案 1 :(得分:6)

对这个确切的问题进行了有趣的讨论here(来自VB6的人)。

你问题的观点中最相关的一点是:

  

“创建窗口时,任务栏   检查窗口的扩展风格   看看是否有WS_EX_APPWINDOW   (&amp; H40000)或WS_EX_TOOLWINDOW(&amp; H80)   风格已打开。如果是WS_EX_APPWINDOW   打开,任务栏显示一个   窗口的按钮,如果WS_EX_   任务栏打开了TOOLWINDOW   没有显示窗口的按钮。   一个窗口永远不应该同时拥有   这些扩展的风格。如果是窗口   没有这些风格,   任务栏决定创建一个按钮   如果窗户是无主的,那么   如果窗口是,则创建一个按钮   拥有。“

     

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

答案 2 :(得分: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一起使用。窗口菜单和最小/最大按钮仍然可见。

答案 3 :(得分: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;

这将有所帮助,我有同样的问题,搜索整个网但没有resolt

答案 4 :(得分:0)

通过BordersStyle bsDialog / bsToolWindow解决了我在这个领域的问题(但后来我不需要min / max ......)。但我想知道为什么你应该想要结合这些属性..它会不会混淆'普通'用户?

答案 5 :(得分:0)

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

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

感谢您的帮助 PJ

答案 6 :(得分:-1)

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

ShowWindow(_window, SWHide);

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

ShowWindow(_window, SWShow);