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;

启动应用程序后,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;

并将此语句添加到 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给出了答案:

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

并且消息的参数进一步解释:

w参数:

指示窗口是被激活还是被停用。如果正在激活窗口,则此参数为 TRUE;如果窗口被停用,则为 FALSE。

于 2012-06-27T12:11:04.217 回答