7

Application.OnActivate の動作をテストする D7 アプリケーションを作成しました。
これは関連部分です:

procedure TMainForm.FormCreate (Sender: TObject);
begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.FormCreate - Begin');

  Application.OnActivate := AppActivate;

Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.FormCreate - End');
end;


procedure TMainForm.AppActivate (Sender: TObject);
begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppActivate - Begin');

  ShowWidthsHeights (Sender);

Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppActivate - End');
end;


procedure TMainForm.ShowWidthsHeights (Sender: TObject);

begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.ShowWidthsHeights -     Begin');

Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.ShowWidthsHeights -     End');
end;

アプリケーションを起動した後、Memo1 の内容
は 次
の とおり
です 。 AppActivate - 終了


それは正しいです 。

しかし、タスクバーのショートカットをクリックすると、次の 4 行が Memo1 に追加されます:
7 - MainForm.AppActivate - Begin
8 - MainForm.ShowWidthsHeights - Begin
9 - MainForm.ShowWidthsHeights - End
10 - MainForm.AppActivate - End

なぜD7はそうするのですか?
私のアプリケーションはアクティブ化されていません。逆に、非アクティブ化されています。


Application.OnDeactivate イベントも発生するかどうかをテストするために、次のイベント ハンドラを追加しました。

procedure TMainForm.AppDeactivate(Sender: TObject);
begin
Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppDeactivate - Begin');

Memo1.Lines.Add (IntToStr (Memo1.Lines.Count + 1) + ' - MainForm.AppDeactivate - End');
end;

そして、このステートメントを TMainForm.FormCreate に追加しました:

Application.OnDeactivate := AppDeactivate;  

アプリケーションの起動後、Memo1 には元のケースと同じ 6 行が含まれていましたが、タスクバーのショートカットをクリックすると、Memo1 に 8 行が追加されました。

7 - MainForm.AppDeactivate - Begin  
8 - MainForm.AppDeactivate - End  
9 - MainForm.AppActivate - Begin  
10 - MainForm.ShowWidthsHeights - Begin  
11 - MainForm.ShowWidthsHeights - End  
12 - MainForm.AppActivate - End  
13 - MainForm.AppDeactivate - Begin  
14 - MainForm.AppDeactivate - End  

したがって、私のアプリケーションは非アクティブ化され、次にアクティブ化され、その後再び非アクティブ化されます!
それはかなり紛らわしいです!

4

1 に答える 1

1

デビッドのコメントがすでに述べたように、それはWM_ACTIVATEメッセージの受信を反映しています。http://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspxは答えを与えます:

アクティブなウィンドウとは異なるアプリケーションに属するウィンドウがアクティブ化されようとしているときに送信されます。メッセージは、ウィンドウがアクティブ化されているアプリケーションと、ウィンドウが非アクティブ化されているアプリケーションに送信されます。

メッセージのパラメーターはさらに説明します。

wParam:

ウィンドウがアクティブ化されているか非アクティブ化されているかを示します。ウィンドウがアクティブ化されている場合、このパラメーターは TRUE です。ウィンドウが非アクティブ化されている場合は FALSE です。

于 2012-06-27T12:11:04.217 に答える