2014-08-29 13 views
9

Tôi có một số mã được đặt sau "Application.Run;" thường chạy khi ứng dụng tắt. Tuy nhiên, điểm này không bao giờ đạt được khi người dùng khởi động lại hoặc tắt Windows.Delphi: mã sau khi Application.Run không thực hiện nếu người dùng khởi động lại/tắt

Điều này có thể được giải quyết mà không cần chụp WM_ENDSESSION không? (và không liên quan đến bất kỳ hình thức nào, tôi muốn mã vẫn còn sau khi application.run ở cuối của dpr)

Trả lời

18

VCL đã nghe cho WM_ENDSESSION (cửa sổ ứng dụng ẩn) và chấm dứt ứng dụng khi phiên là kết thúc. Bạn có thể add a terminate procedure trong .dpr (hoặc ở nơi khác) sẽ được gọi trong số các thủ tục chấm dứt có thể khác:

program Project1; 

uses 
    Vcl.Forms, 
    sysutils, 
    Unit2 in 'Unit2.pas' {Form2}; 

{$R *.res} 

function OnTerminate: Boolean; 
begin 
    Result := True; 
    // do some short work 
end; 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm2, Form2); 
    AddTerminateProc(OnTerminate); 
    Application.Run; 
end. 
+1

Điều đó thật tuyệt vời, cảm ơn bạn! – hikari

+0

Phương pháp này thực sự có một số ý nghĩa khó chịu .. nếu vì lý do nào đó, biểu mẫu bị "kẹt", OnTerminate có thể được gọi trước khi các biểu mẫu bị hủy, tức là tôi đang truy cập một số đối tượng trong sự kiện gần của biểu mẫu. các proc OnTerminate, chúng tôi sẽ nhận được một ngoại lệ. (tức là tôi thực hiện GET trên một ổ cắm chặn bị ràng buộc hết thời gian chờ trong vài giây, sau đó tôi nhấp vào X để đóng ứng dụng, OnTerminate sẽ được gọi trước khi bất kỳ biểu mẫu nào bị đóng và hủy). Lý tưởng nhất là chúng ta có thể để lại mã sau .Run; tại sao nó không được thực hiện trong trường hợp tắt hệ thống? – hikari

+1

@Hikari - Bạn dường như đang tìm kiếm một số nơi tách rời khỏi các biểu mẫu. Nếu đó không phải là trường hợp, tại sao không đặt mã của bạn trong một trình xử lý tin nhắn trong biểu mẫu đó? Khi TApplication nhận được một WM_ENDSESSION, nó không chờ đợi thông báo WM_QUIT kết thúc, đó là lý do tại sao các câu lệnh sau khi Run không chạy. –

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