私のアプリケーションには、ユーザーがタスク バーではなくシステム トレイでのみ実行するオプションがあります。アプリケーションが Delphi 6 でビルドされたとき、これは正常に機能しました。Delphi XE2 に切り替えた後、機能しなくなりました。
私はそれをいじりましたが、これは Windows 7 で動作していますが、Windows XP で実行しているときはまだ問題があります。アプリケーションがタスク バーから正しく非表示になり、システム トレイに表示されます。しかし、追加のフォームを作成して表示すると、Windows XP でアイコンが表示されます。
procedure TfrmAppointment.HideWindowFromTaskbar;
var
TaskbarList: ITaskbarList;
begin
Application.MainFormOnTaskBar := False;
// Windows 7 seems to behave differently. This seems to fix it.
if (CheckWin32Version(6, 1)) then
begin
// We are in Win7, and we requested the tray.
TaskbarList := CreateComObject(CLSID_TaskbarList) as ITaskbarList;
TaskbarList.HrInit;
TaskbarList.DeleteTab(Application.Handle);
end
else
begin
// Previous code from D6 days
ShowWindow(Application.Handle, SW_HIDE);
SetWindowLong(Application.Handle, GWL_EXSTYLE, GetWindowLong(Application.Handle, GWL_EXSTYLE) or WS_EX_TOOLWINDOW);
ShowWindow(Application.Handle, SW_SHOWNOACTIVATE);
end;
end;
システム トレイにアプリケーションを表示するオプションをユーザーが選択すると、そのコードが実行されます。私がテストしたすべてのバージョンの Windows で問題なく動作します。ただし、Windows XP では、子フォームを表示すると、アプリケーションがタスクバーに即座に表示されます。Windows 7 ではすべて問題ありません。
私が見逃しているアイデアはありますか?
これはDelphi 2009 アプリケーションのメイン フォームを非表示にする と同じ質問である可能性が高いことを知っていることを付け加えておく必要がありますが、既に MainFormOnTaskBar が設定されているため、その答えは当てはまらないようです。
[編集:] より具体的に言うと、ここに追加情報を追加します。このアプリケーションには、タスク バーに表示するモードとシステム トレイに表示するモードの 2 つのモードがあります。
最初のモードは、通常のアプリケーションと同じです。アプリケーションはタスク バーにのみ存在します。タスクバーに最小化します。タスクバーから復元します。
2 番目のモードはまったく同じように動作しますが、そのタスク バー アイコンは代わりにシステム トレイにのみ存在します。したがって、ユーザーがアプリケーションを最小化すると、そのメッセージをインターセプトし、'Shell_TrayWnd'/'TrayNotifyWnd' の TRect を取得し、DrawAnimatedRects() を呼び出して、トレイへの最小化をシミュレートします。次に、メイン フォームを非表示にします。システム トレイからのメッセージで、同じアニメーション四角形を逆に描画し、再び表示します。フォームが表示されている間、タスク バーには表示されません。
これはすべて、すべての Windows バージョンで問題なく動作します。
私が抱えている特定の問題は、他のフォームが表示されると、Windows XP がタスク バーにアプリケーション アイコンを作成していることです。Windows 7 はこれを行いません。したがって、Windows XP ユーザーがアプリケーションのメイン フォームのみを使用する場合、問題は発生せず、両方の表示モードが正常に機能します。別のウィンドウを開くと、アプリケーション アイコンが表示され、そのウィンドウを閉じた後もそこにとどまります。Windows 7 はこれを行わず、アイコンは表示されません。