4

VCL 以外のホスト アプリケーションからロードした CBuilder/Delphi dll が混在しています。RAD Studio XE2 を使用しています。dll をロードしたら、アプリケーション ハンドルをホストのメイン フォームに設定しました。これにより、フォームとダイアログがタスクバーに表示されなくなります。ただし、タスクバーに進行状況バーを表示して、ホスト アプリケーションとスタックさせたいと考えています。私はグーグルで広範囲に検索しましたが、同様のものを見つけることができません。

ボブ博士は、タスクバーのさまざまな機能についてここに素晴らしいチュートリアルを書きました。それから、メイン アプリケーションのタスクバー ボタンにプログレス バーが表示されるようになりました。 、多くのアプリケーションで行われています。Dr. Bob の例では、ユーザーがメイン アプリケーションの一部であると想定し、次のコードを使用してタブを追加します。

if not Application.MainFormOnTaskBar then
  FormHandle := Application.Handle
else FormHandle := Application.MainForm.Handle;
TaskbarList.AddTab(FormHandle);

私の場合は何もしません。私はもう試した

FormHandle := FindWindow('TfmProg', NIL);
TaskbarList.addTab(FormHandle);

しかし、それは何も変わりません。

Application を所有者とし、NIL でフォームを作成しました。fsNormal または fsStayOnTop を作成しました。率直に言って、取得できるすべてのパラメーターに触れましたが、何も機能していないようです。

4

1 に答える 1

2

Application.Handleホストアプリのメインフォームのハンドルになるように設定するのは正しいです。これにより、ホストアプリのメインウィンドウがウィンドウの所有者になります。ただし、ご覧のとおり、これによりトップレベルのウィンドウがタスクバーから外れます。これは、所有している最上位ウィンドウがタスクバーに表示されないためです。

WS_EX_APPWINDOW所有しているトップレベルウィンドウをタスクバーに配置するには、拡張ウィンドウスタイルを含める必要があります。CreateParamsこれをフォームの手順に追加します。

procedure CreateParams(var Params: TCreateParams); override;
....
procedure TMyForm.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
end;

次に、とを使用ITaskbarList3.SetProgressStateしてITaskbarList3.SetProgressValue、フォームのハンドルを渡し、フォームのタスクバーボタンのタスクバーの進行状況を表示できます。


私はあなたのコードが奇妙だと思ったことを認めなければなりません:

FormHandle := FindWindow('TfmProg', NIL);
TaskbarList.addTab(FormHandle);

FindWindowコードはDLLで実行されており、DLLもフォームを作成しているため、ハンドルを取得するために使用するべきではありません。フォームインスタンスへの参照がForm.Handleどこにあるかを使用できます。とは言うものの、ウィンドウハンドルの再作成に対して弾力性があり、私にはかなり単純に感じるのでForm、を使用して上記で概説したアプローチを引き続き好みます。WS_EX_APPWINDOW

于 2013-02-27T22:45:44.977 に答える