我需要从任务栏隐藏Windows窗体但我不能使用WS_EX_TOOLWINDOW
因为我需要系统菜单和窗体标题栏上的最小/最大按钮。
如果我在运行时将表单切换到工具窗口,表单外观会被填满。从Web上搜索,我看到VB有一个ShowInTaskbar属性,我想知道这是否能做我想要的,以及它是否可以在Delphi 2006中实现。此项目也是一个COM服务器,没有MainForm等。
答案 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);