Nascondi il pulsante della barra delle applicazioni di un modulo senza utilizzare WS_EX_TOOLWIN

StackOverflow https://stackoverflow.com/questions/261601

  •  06-07-2019
  •  | 
  •  

Domanda

Devo nascondere un modulo di Windows dalla barra delle applicazioni ma non posso usare WS_EX_TOOLWINDOW perché ho bisogno del menu di sistema e dei pulsanti min / max sulla barra del titolo del modulo.

Se passo il modulo in una finestra degli strumenti in fase di esecuzione, lo skin skin del modulo viene riempito. Dalla ricerca sul Web vedo che VB ha una proprietà ShowInTaskbar e mi chiedo se questo farebbe quello che voglio e se possa essere implementato in Delphi 2006. Anche questo progetto è un server COM e non ha MainForm, ecc.

È stato utile?

Soluzione

C'è un'interessante discussione su questo esatto problema qui (da una prospettiva VB6).

Il bit più rilevante dal punto di vista della tua domanda è:

  

" Quando crei una finestra, la barra delle applicazioni   esamina lo stile esteso della finestra   per vedere se WS_EX_APPWINDOW   (& amp; H40000) o WS_EX_TOOLWINDOW (& amp; H80)   lo stile è attivato. Se WS_EX_APPWINDOW   è attivato, la barra delle applicazioni mostra a   pulsante per la finestra e se WS_EX_   TOOLWINDOW è attivato, la barra delle applicazioni   non mostra un pulsante per la finestra.   Una finestra non dovrebbe mai avere entrambi   questi stili estesi. Se la finestra   non ha nessuno di questi stili,   la barra delle applicazioni decide di creare un pulsante   se la finestra non è di proprietà e non lo è   crea un pulsante se la finestra è   . Posseduto "

     

Per inciso, si utilizza GetWindow   Funzione API con il flag GW_OWNER su   determinare se una finestra è di proprietà.

Altri suggerimenti

Grazie a Stu per avermi fornito la risposta così rapidamente. Nel mio caso ho dovuto aggiungere manualmente l'handle del form proprietario in CreateParams, ma potrebbe non essere necessario in altri / normali casi.

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;

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

L'ho provato e ha funzionato con Delphi2006. E i menu di Windows e i pulsanti min / max sono ancora visibili.

in Delphi XE (2010) funziona perfettamente: devi modificare il modulo principale,

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.

(per questo modulo principale cerca in " finestra di modellazione " finestra)

dopo, vai su unit1.pas, la tua unità di moduli principale e " OnShow " evento di form1 do:

procedure TForm1.FormShow(Sender: TObject);

begin

ShowWindow(Application.Handle, SW_HIDE);

end;

questo mi aiuterà, ho avuto lo stesso problema, ho cercato su tutta la rete ma senza resistenza

Risolti i miei problemi in quest'area con BordersStyle bsDialog / bsToolWindow (ma non avevo bisogno del min / max ...). Ma mi chiedo perché dovresti voler combinare questi attributi. Non confonderai l'utente "normale"?

Sto cercando un pezzo di codice per integrare una casella di testo nella barra delle applicazioni di Windows.

Ho intenzione di creare una barra degli strumenti che non riesco a 'integrare nella barra delle applicazioni.

Grazie per l'aiuto pj

Un modo per farlo in C # è:

ShowWindow(_window, SWHide);

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

ShowWindow(_window, SWShow);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top