Delphi XEでは、GetForegroundWindowを使用して、アプリケーションがアクティブ化される直前にアクティブだったウィンドウを検出しようとしています。「アクティブ化」とは、アプリが象徴的な状態から復元されたか、alt + tabを介して切り替えられたか、activatonホットキーなどによって起動された可能性があることを意味します。
問題は、使用可能なすべてのアプリケーションイベント(OnActivate、OnRestore)が遅すぎるため、GetForegroundWindowが自分のフォームのハンドルを返すことです。メインフォームのイベントはさらに役に立ちません。メインフォームでのWM_ACTIVATEAPPの処理も遅すぎます。
1つの方法は、アプリケーションがアクティブでない間、タイマーのアクティブウィンドウをチェックし続けることですが、これはかなり無駄に思えます。はるかに優れた解決策は、TApplication.WndProcをサブクラス化し、WM_ACTIVATEAPPが処理される前に自分のことを実行することですが、TApplicationをサブクラス化できるとは思いません。
もっと良い方法はありますか?