設計上、最小化されたウィンドウ自体は再描画されないため、Vistaのツールバーアプリケーションのサムネイルは、アプリケーションが最小化されても更新されません。私が持っている監視アプリケーションの場合、アプリケーションを最小化したまま、アプリケーションのサムネイルを更新すると便利です。私はDelphi2009を使用しています。誰かがこれに対する良い回避策を提案できますか?
HMcG
設計上、最小化されたウィンドウ自体は再描画されないため、Vistaのツールバーアプリケーションのサムネイルは、アプリケーションが最小化されても更新されません。私が持っている監視アプリケーションの場合、アプリケーションを最小化したまま、アプリケーションのサムネイルを更新すると便利です。私はDelphi2009を使用しています。誰かがこれに対する良い回避策を提案できますか?
HMcG
これは興味深いものです。WindowsAPIを使用すると、何らかの方法で可能になると思います。現在、ビスタマシンを使用していませんが、Windows Media Playerは、最小化してもビデオの再生を表示すると思います。
ハックは、最小化ボタンをオーバーライドしてフォームを画面外に移動し、フォームが再びアクティブになったことを検出して、元の場所に戻すことだと思います。これは、フォームが表示されないが最小化されていないことを意味します。
このトピックに対処するMicrosoft開発フォーラムで何かを見つけました。質問は、カスタムサムネイル画像を提供する方法についてでした。これに対して、MicrosoftのLeonardoBlancoは次のように回答しました。
アプリがカスタムの代替サムネイル表現を作成する手段を提供する予定はありませんが、通常のサムネイル画像を完全にオプトアウトするためのAPIを提供します...。
DwmSetIconicLivePreviewBitmap
関数のMSDNとDwmSetIconicThumbnail
Windows7の存在から判断すると、これらの計画はその間に変更された可能性があります。現在、これらのエントリには実際には説明が含まれていませんが、名前は有望に見えます。
Windows Media Playerのサムネイルには、ウィンドウが最小化されていても動画が表示されるとの指摘がありました。ブランコの説明:
WMPは、[デスクトップウィンドウマネージャー]と直接通信する新しいビデオパイプラインを使用して、よりスムーズな再生エクスペリエンスを実現します。このパイプラインは[DirectX]に依存し、ウィンドウの可視性情報に依存しないため、アプリがフレームを送信し続ける限り、ウィンドウが最小化されていてもサムネイルを存続させることができます。ただし、ビデオの周りのUIがもうライブではないことに気付くかもしれません(ビデオの周りのUIは通常更新されないため、これを観察するのは難しいです)。このメソッドの詳細については、
DwmSetPresentParameters
APIを参照してください。
私はこれについてこれ以上何も見つけることができないのではないかと思います。DWM関数のドキュメントはまばらです。
アプリケーションの性質を考えると、ガジェットをWindowsサイドバーに配置することを検討する価値があるかもしれません。
この回避策がDelphi2009でも機能するかどうかはわかりません。CreateParamsをオーバーライドして、GetDesktopWindowをWndParentとして設定します。
過去にApplication.Titleを変更して、タスクバーボタンにいくつかの情報を表示しました。これによりアイコンが再描画されるとは思いませんか?
Delphi 2007では、次のように設定すると、メインフォームがタスクバーに表示されます。
Application.MainFormOnTaskbar := True;
それを更新し続けるには、アプリケーションが最小化されないようにし、代わりに単に後ろに移動する必要があります。これを行うには、フォームにTApplicationEventsを配置し、イベントハンドラーをOnMinimizeイベントに割り当ててから、そこでApplication.Restoreを呼び出します。独自の最小化状態を追跡し、他のすべてのフォームを非表示にして(存在する場合)、メインフォームのみを表示しますが、「最小化」されている場合はZオーダーが最も低くなります。
Windows Vistaでは、フォームを画面の外に移動できるとは思いません。または、それを実行することもできます。多分それの周りにハックがあります。
幸運を!
ソースプロジェクトに移動し、Application.MainFormOnTaskbarをfalseに変更します。Application.MainFormOnTaskbar:= false;
よろしく、マウリシオ