我写了一个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 - 开始
2 - MainForm.FormCreate - 结束
3 - MainForm.AppActivate - 开始
4 - MainForm.ShowWidthsHeights - 开始
5 - MainForm.ShowWidthsHeights - 结束
6 - MainForm.AppActivate - 结束
这是正确的。
但如果我点击任务栏中的快捷方式,这4行就会添加到Memo1:
7 - MainForm.AppActivate - 开始
8 - MainForm.ShowWidthsHeights - 开始
9 - MainForm.ShowWidthsHeights - 结束
10 - MainForm.AppActivate - 结束
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
因此,我的应用程序被取消激活,然后激活,然后再次停用! 这太令人困惑了!
答案 0 :(得分:1)
正如大卫的评论所说,这反映了收到WM_ACTIVATE
消息。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspx给出答案:
当即将激活属于与活动窗口不同的应用程序的窗口时发送。消息将发送到正在激活窗口的应用程序以及其窗口正在停用的应用程序。
并且消息的参数进一步说明:
wParam参数:
指示窗口是激活还是停用。如果正在激活窗口,则此参数为TRUE;如果窗口被停用,则为FALSE。