2012-06-27 26 views
7

Tôi đã viết một ứng dụng D7 để kiểm tra hành vi của Application.OnActivate.
Đây là phần có liên quan:Hành vi không mong muốn của Ứng dụng.Kích hoạt trong Delphi 7

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; 

Sau khi khởi động ứng dụng, nội dung của Memo1 là:
1 - MainForm.FormCreate - Bắt đầu
2 - MainForm.FormCreate - End
3 - MainForm. AppActivate - Bắt đầu
4 - MainForm.ShowWidthsHeights - Bắt đầu
5 - MainForm.ShowWidthsHeights - End
6 - MainForm.AppActivate - End

Điều đó là chính xác.

Nhưng nếu tôi sau đó bấm vào một phím tắt trên thanh taskbar, những 4 dòng được thêm vào Memo1:
7 - MainForm.AppActivate - Bắt đầu
8 - MainForm.ShowWidthsHeights - Bắt đầu
9 - MainForm.ShowWidthsHeights - Kết thúc
10 - MainForm.AppActivate - Kết thúc

Tại sao D7 làm điều đó?
Đơn đăng ký của tôi chưa được kích hoạt, ngược lại, nó đã bị hủy kích hoạt!


Để kiểm tra xem sự kiện Application.OnDeactivate cũng bị sa thải, tôi đã thêm xử lý sự kiện này:

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; 

và thêm vào bản Tuyên Bố này để TMainForm.FormCreate:

Application.OnDeactivate := AppDeactivate; 

Sau khi khởi động ứng dụng, Memo1 chứa 6 dòng giống như trong trường hợp ban đầu, nhưng nhấp vào một lối tắt trong thanh tác vụ dẫn đến 8 dòng phụ trong Memo1:

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 

Vì vậy, ứng dụng của tôi bị vô hiệu hóa, sau đó kích hoạt, và sau đó ngừng hoạt động lại!
Khá khó hiểu!

+1

Delphi đơn giản phản ánh cho bạn thông điệp 'WM_ACTIVATEAPP' mà Windows gửi tới ứng dụng của bạn. Tại sao Windows lại làm như vậy, tôi không biết. –

+0

Bạn có tích cực là từ 7 đến 10 được ghi lại khi bạn * lần đầu tiên nhấp * trên nút thanh tác vụ (có lẽ có lẽ sẽ giảm thiểu biểu mẫu), hoặc khi bạn bấm lại để xem bản ghi nhớ? Bạn có thể sử dụng 'OutputDebugString' và 'Event Log' (ctrl + alt + v) thay vì đăng nhập vào bản ghi nhớ để chắc chắn. –

+1

@Sertac Yeah, tôi đã kiểm tra điều này rồi. Nó chính xác như được mô tả trong Q. –

Trả lời

1

Như nhận xét của David đã nêu, nó phản ánh việc nhận được thông báo WM_ACTIVATE. http://msdn.microsoft.com/en-us/library/windows/desktop/ms632614(v=vs.85).aspx cho câu trả lời:

Được gửi khi cửa sổ thuộc một ứng dụng khác với cửa sổ đang hoạt động sắp được kích hoạt. Tin nhắn được gửi đến ứng dụng có cửa sổ đang được kích hoạt và ứng dụng có cửa sổ bị tắt.

và các tham số của thông điệp giải thích thêm:

wParam:

Cho biết các cửa sổ đang được kích hoạt hoặc ngừng hoạt động. Tham số này là TRUE nếu cửa sổ đang được kích hoạt; nó là FALSE nếu cửa sổ đang bị hủy kích hoạt.

+1

Điều đó không giải thích được nút bấm của thanh tác vụ sẽ gửi một kích hoạt ngay lập tức theo sau là kích hoạt. –

+1

David, bạn nói đúng. @Roald, để rõ ràng nhầm lẫn, có một WM_ACTIVATEAPP rằng tín hiệu kích hoạt và ngừng hoạt động, nhưng có hai sự kiện Delphi khác nhau. Thư viện Delphi capture WM_ACTIVATEAPP và tùy thuộc vào wParam nó sau đó kích hoạt một CM_ACTIVATE hoặc một CM_DEACTIVATE; lần lượt được TApplication chụp để kích hoạt các sự kiện onActivate hoặc onDeactivate. –

+0

Và vẫn còn các phiếu bầu cho đến một câu trả lời không giải quyết được câu hỏi đã được hỏi. Sigh ..... –

Các vấn đề liên quan