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.

Foi útil?

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top