Delphi 7中Application.OnActivate的意外行为

Ruu*_*itz 7 delphi delphi-7

我写了一个D7应用程序来测试Application.OnActivate的行为.
这是相关部分:

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;
Run Code Online (Sandbox Code Playgroud)

启动应用程序后,Memo1的内容为:
1 - MainForm.FormCreate - Begin
2 - MainForm.FormCreate - End
3 - MainForm.AppActivate - Begin
4 - MainForm.ShowWidthsHeights - Begin
5 - MainForm.ShowWidthsHeights - End
6 - MainForm. 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;
Run Code Online (Sandbox Code Playgroud)

并将此声明添加到TMainForm.FormCreate:

Application.OnDeactivate := AppDeactivate;  
Run Code Online (Sandbox Code Playgroud)

启动应用程序后,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  
Run Code Online (Sandbox Code Playgroud)

因此,我的应用程序被取消激活,然后激活,然后再次停用!
那太混乱了!

R-D*_*R-D 1

正如大卫的评论已经指出的,这反映了信息的接收WM_ACTIVATEhttp://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspx给出了答案:

当属于与活动窗口不同的应用程序的窗口即将被激活时发送。该消息被发送到其窗口正在被激活的应用程序以及其窗口正在被停用的应用程序。

消息的参数进一步解释:

w参数:

指示窗口是否正在激活或停用。如果窗口正在激活,则该参数为 TRUE;如果窗口正在停用,则为 FALSE。