web-dev-qa-db-ja.com

Windows 7のタスクバーからアプリケーションを非表示にする方法は?

Windows7のタスクバーからアプリケーションを非表示にしたいと思います。

画面の端にあるツールバーのように、ユーザーがクリックすると特定の処理を実行するようなものを作成したいのですが、バックグラウンドに残したいので、タスクバーに表示したくありません。 。

次の投稿の手順を試しましたが、アプリケーションで機能しませんでした。

タスクバーエントリを非表示にしてウィンドウフォームを保持する方法

次に、新しい空のVCLフォームアプリケーションで試してみましたが、それでも機能しませんでした。私は他の解決策を探しましたが、それらはすべてリンクされた投稿のようにほとんど同じです。

何かが変わったので、Windows 7ではそれが不可能になりますか?それとも、それが機能しなくなる可能性があると思うことがありますか?

14
Marks

メインフォームの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:= ..)を削除し、代わりにオブジェクトインスペクターでフォームのPopupModepmExplicitに設定して同じ効果を得ることができます。


ところで、これがソリューションの同じトピックからのドキュメントの引用です TLamaが投稿しました

ウィンドウボタンがタスクバーに配置されないようにするには、[...]別の方法として、非表示のウィンドウを作成し、この非表示のウィンドウを表示されているウィンドウの所有者にすることができます。

MainFormOnTaskbarをfalseに設定すると、メインフォームはVCL設計によってアプリケーションウィンドウによって所有されます。また、アプリケーションウィンドウを非表示にすると、要件が満たされます。

9
Sertac Akyuz

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.
8
TLama

アプリケーションのメインフォームは通常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
1
Glenn