Esconder botão da barra de tarefas de um formulário sem usar WS_EX_TOOLWIN
Pergunta
Eu preciso ocultar um formulário do Windows na barra de tarefas, mas não posso usar WS_EX_TOOLWINDOW
porque eu preciso do menu do sistema e mínimo de botões / max na barra de título do formulário.
Se eu mudar a forma de uma janela de ferramenta em tempo de execução da esfola formulário está entupido. De pesquisar na Web vejo que VB tem uma propriedade ShowInTaskbar e eu estou querendo saber se isso iria fazer o que quero, e se ele pode ser implementado em Delphi 2006. Além disso, este projeto é um servidor COM e não tem MainForm, etc.
Solução
Há uma discussão interessante sobre este problema exato aqui (a partir de um persepective VB6).
A pouco mais relevante do ponto de vista da sua pergunta é:
"Quando você cria uma janela, a barra de tarefas examina estilo estendido da janela para ver se tanto o WS_EX_APPWINDOW (& H40000) ou WS_EX_TOOLWINDOW (& H80) estilo está ligado. Se WS_EX_APPWINDOW é ligada, a barra de tarefas mostra um botão para a janela, e se WS_EX_ Toolwindow é ligado, a barra de tarefas não mostra um botão para a janela. Uma janela nunca deve ter dois estes estilos estendidos. Se a janela não tem qualquer um desses estilos, a barra de tarefas decide criar um botão Se a janela não tem dono e não faz criar um botão se a janela estiver propriedade ".
A propósito, você usa o GetWindow função da API com a bandeira GW_OWNER para determinar se uma janela é de propriedade.
Outras dicas
Graças à Stu para me colocar à resposta tão rapidamente. No meu caso eu tive que adicionar manualmente alça do formulário possuir nas CreateParams, mas isso pode não ser necessário em outras normal / casos.
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;
Com graças a 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;
Eu testei e funcionou com Delphi2006. E menu de janelas e min / max botões ainda são visíveis.
em Delphi XE (2010), este funciona perfeitamente: que deviam editar formulário principal,
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.
(para este formulário de pesquisa principal em "modelar vista" janela)
Depois disso, ir para Unit1.pas, a sua unidade formas principal e "OnShow" caso de form1 fazer:
procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
Isso vai ajudar, eu tive o mesmo problema, procurou net todo, mas sem resolt
resolvido meus problemas nesta área por BordersStyle bsDialog / bsToolWindow (mas então eu não preciso do min / max ...). Mas eu me pergunto por que você deve querer combinar esses atributos .. Não vai confundir o usuário 'normal'?
Eu estou procurando um pedaço de código para integrar uma caixa de texto para a barra de tarefas Windows.
Eu pretendo criar uma barra de ferramentas que puder para não 'integrá-lo à barra de tarefas.
Obrigado por sua ajuda pj
Uma maneira de fazer isso em C # é:
ShowWindow(_window, SWHide);
int style = GetWindowLong(_window, GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(_window, GWL_EXSTYLE, style);
ShowWindow(_window, SWShow);