15

Windows 7 のタスク バーからアプリケーションを非表示にしたいと考えています。

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

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

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

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

Windows 7でそれを不可能にする何かが変更されましたか? または、それが機能するのを妨げる可能性があると考えられるものはありますか?

4

3 に答える 3

12

メイン フォームをオーバーライドして、タスクバー ボタン ( )CreateParamを強制するフラグを削除し、さらにフォームをアプリケーション ウィンドウに所有させることができます。これは、シェルがウィンドウのタスクバー ボタンを配置するという要件の反対を行っています。タスクバーボタンの管理」から: WS_EX_APPWINDOW

[..] ウィンドウ ボタンがタスク バーに配置されるようにするには、 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が投稿したソリューションの同じトピックからのドキュメントの引用は次のとおりです。

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

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

于 2013-02-14T17:54:09.187 に答える
9

で説明されているトリッキーな方法を使用してみてください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.パス:

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.
于 2013-02-14T15:53:10.643 に答える
2

アプリケーションのメイン フォームは通常 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 フラグが削除されるため、toolwindow フラグに興味がない場合は、次の部分を省略できます。

i OR WS_EX_TOOLWINDOW
于 2015-01-07T07:05:00.917 に答える