6

Delphi XEでは、GetForegroundWindowを使用して、アプリケーションがアクティブ化される直前にアクティブだったウィンドウを検出しようとしています。「アクティブ化」とは、アプリが象徴的な状態から復元されたか、alt + tabを介して切り替えられたか、activatonホットキーなどによって起動された可能性があることを意味します。

問題は、使用可能なすべてのアプリケーションイベント(OnActivate、OnRestore)が遅すぎるため、GetForegroundWindowが自分のフォームのハンドルを返すことです。メインフォームのイベントはさらに役に立ちません。メインフォームでのWM_ACTIVATEAPPの処理も遅すぎます。

1つの方法は、アプリケーションがアクティブでない間、タイマーのアクティブウィンドウをチェックし続けることですが、これはかなり無駄に思えます。はるかに優れた解決策は、TApplication.WndProcをサブクラス化し、WM_ACTIVATEAPPが処理される前に自分のことを実行することですが、TApplicationをサブクラス化できるとは思いません。

もっと良い方法はありますか?

4

2 に答える 2

6

アプリケーションがアクティブになると、最上位のウィンドウになります。IOW、それは最上位のZオーダーの位置にジャンプします。

これにより、前の一番上のウィンドウが「新しい一番上のウィンドウのすぐ下」の位置に降格されます。IOW、Zオーダーの位置で2番目になります。

GetNextWindowを呼び出して、フォームのハンドルとGW_HWNDNEXTを渡すと、必要な結果が得られる場合があります。

于 2011-01-26T11:51:49.657 に答える
0

すべてのウィンドウにはzオーダーがあります。これは、ウィンドウがどのウィンドウをどのウィンドウの上にペイントするかを決定するために使用する番号です。

プログラムをアクティブ化すると、アプリケーションはzリストの一番上に配置されます。

Alt-Tabキーを押すと、Windowsはそのリストを循環します。したがって、Alt-Tabを押したままにして、注文方法を確認します。

alt-tabをシミュレートする方法については、こちらをご覧ください: http ://www.swissdelphicenter.ch/torry/showcode.php?id=2103

于 2011-01-26T11:57:40.567 に答える