WS_EX_TOOLWIN を使用せずにフォームのタスクバー ボタンを非表示にする
質問
タスクバーから Windows フォームを非表示にする必要がありますが、使用できません WS_EX_TOOLWINDOW
フォームのタイトル バーにシステム メニューと最小/最大ボタンが必要なためです。
実行時にフォームをツールウィンドウに切り替えると、フォームスキニングが詰まってしまいます。Web で検索すると、VB には ShowInTaskbar プロパティがあることがわかり、これで希望どおりのことができるかどうか、また Delphi 2006 で実装できるかどうか疑問に思っています。また、このプロジェクトはCOMサーバーであり、MainFormなどはありません。
解決
この正確な問題に関する興味深い議論がありますこちら(VB6パースペクティブから)。
質問の観点から最も関連する部分は次のとおりです:
"ウィンドウを作成すると、タスクバー ウィンドウの拡張スタイルを調べます WS_EX_APPWINDOW (& H40000)またはWS_EX_TOOLWINDOW(& H80) スタイルがオンになっています。 WS_EX_APPWINDOWの場合 オンにすると、タスクバーに ウィンドウのボタン、およびWS_EX_ TOOLWINDOWがオンになっている、タスクバー ウィンドウのボタンは表示されません。 ウィンドウに両方が含まれることはありません これらの拡張スタイル。ウィンドウが これらのスタイルのいずれもありません、 タスクバーはボタンを作成することを決定します ウィンドウが所有されていない場合 ウィンドウが 所有。"
ちなみに、GetWindowを使用します GW_OWNERフラグを使用したAPI関数 ウィンドウが所有されているかどうかを判断します。
他のヒント
すぐに答えてくれた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;
http://www.scalabium.com/faq/dct0096.htm <に感謝/ a>。
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で動作しました。また、ウィンドウメニューと最小/最大ボタンは引き続き表示されます。
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、メインフォームユニット、および「OnShow」に移動します。 form1のイベントdo:
procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
これは助けになります。同じ問題があり、ネット全体を検索しましたが、解決できません
この分野の問題は、BordersStyle bsDialog/bsToolWindow によって解決されました(ただし、最小/最大は必要ありませんでした...)。しかし、なぜこれらの属性を組み合わせる必要があるのか不思議です。「通常の」ユーザーは混乱しないでしょうか?
TextboxをWindowsタスクバーに統合するコードを探しています。
ツールバーを作成して、タスクバーに統合することはできません。
ご協力ありがとうございます pj
C#でこれを行う1つの方法は次のとおりです。
ShowWindow(_window, SWHide);
int style = GetWindowLong(_window, GWL_EXSTYLE);
style |= WS_EX_TOOLWINDOW;
SetWindowLong(_window, GWL_EXSTYLE, style);
ShowWindow(_window, SWShow);