Windows7のタスクバーからアプリケーションを非表示にしたいと思います。
画面の端にあるツールバーのように、ユーザーがクリックすると特定の処理を実行するようなものを作成したいのですが、バックグラウンドに残したいので、タスクバーに表示したくありません。 。
次の投稿の手順を試しましたが、アプリケーションで機能しませんでした。
タスクバーエントリを非表示にしてウィンドウフォームを保持する方法
次に、新しい空のVCLフォームアプリケーションで試してみましたが、それでも機能しませんでした。私は他の解決策を探しましたが、それらはすべてリンクされた投稿のようにほとんど同じです。
何かが変わったので、Windows 7ではそれが不可能になりますか?それとも、それが機能しなくなる可能性があると思うことがありますか?
メインフォームのCreateParam
をオーバーライドして、タスクバーボタンを強制するフラグを削除できます(WS_EX_APPWINDOW
)さらに、アプリケーションウィンドウでフォームownedを作成します。これは、シェルがウィンドウのタスクバーボタンを配置するための要件の反対を実行しています。 " タスクバーボタンの管理 "から:
[..]ウィンドウボタンがタスクバーに配置されるようにするには、WS_EX_APPWINDOW拡張スタイルで所有されていないウィンドウを作成します。 [..]
サンプル:
type
TForm1 = class(TForm)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
procedure TForm1.CreateParams(var Params: TCreateParams);
begin
inherited;
Params.ExStyle := Params.ExStyle and not WS_EX_APPWINDOW;
Params.WndParent := Application.Handle;
end;
このメソッドを使用する場合は、「アプリケーション」のMainFormOnTaskbar
プロパティの状態をデフォルトの「True」から変更しないでください。
2行目(..WndParent:= ..)を削除し、代わりにオブジェクトインスペクターでフォームのPopupMode
をpmExplicit
に設定して同じ効果を得ることができます。
ところで、これがソリューションの同じトピックからのドキュメントの引用です TLamaが投稿しました :
ウィンドウボタンがタスクバーに配置されないようにするには、[...]別の方法として、非表示のウィンドウを作成し、この非表示のウィンドウを表示されているウィンドウの所有者にすることができます。
MainFormOnTaskbar
をfalseに設定すると、メインフォームはVCL設計によってアプリケーションウィンドウによって所有されます。また、アプリケーションウィンドウを非表示にすると、要件が満たされます。
this article
で説明されているトリッキーな方法を使用してみてください。
プロジェクトファイルで MainFormOnTaskBar
をFalseに設定します。次に、メインフォームの OnShow
および OnActivate
イベントハンドラーからアプリケーションウィンドウを非表示にしてみてください。したがって、プロジェクトは次のようになります。
Project1.dpr:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := False;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Unit1.pas:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormShow(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
procedure TForm1.FormActivate(Sender: TObject);
begin
ShowWindow(Application.Handle, SW_HIDE);
end;
end.
アプリケーションのメインフォームは通常dprで作成されるため、dprを開いて、メインフォームを作成する行を探します。
// add this line first
// blank app title will prevent app from showing in the applications list in task manager
Application.Title := '';
// this line is already in the dpr and creates the main form, the class will differ
Application.CreateForm(TMainForm, Result);
// make the main form invisible to windows taskbar/task switcher
i := GetWindowLong(Application.Handle, GWL_EXSTYLE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, i OR WS_EX_TOOLWINDOW AND NOT WS_EX_APPWINDOW);
私はこれがXPと7で動作することを知っています。これは8にも適していると思います。これにより、ツールウィンドウフラグが追加され、appwindowフラグが削除されるので、興味がない場合は推測します。次の部分を省略できるツールウィンドウフラグ
i OR WS_EX_TOOLWINDOW