2012-05-24 12 views
9

Tepsi uygulaması yaşıyorum.Windows kapatılıyor veya uygulama sistem menüsünden kapatmaya çalışırsa (WM_CLOSE)

Onj FormCloseQuery ben kontrol ederseniz programı gerektiği git tepsi ve tepsiye (CanCIose: = False) koymak yerine kapattıktan sonra

Ancak Windows, Windows kapatma benim uygulamayı kapatmak çalışırsa ben taşımak istemiyorlar uygulamam tepsi içine ama kapatmak için.

Win7, uygulamanızı sonlandırıyor, ancak uygulamanızın Kaset'te kalması nedeniyle XP kapanmıyor.

Windows'un "kapanma" modunun olup olmadığını nasıl algılayabilirim?

Teşekkürler!

+4

Are you [ 'WM_QUERYENDSESSION'] (http://msdn.microsoft.com/en-us/library/aa376890%28VS.85%29.aspx) mesajı yakalama çalıştı? – RRUZ

+0

Yorumumu bir yanıta taşıdım. –

cevap

7

Sorunlarınız, kullanmakta olduğunuz yanlış olay olan OnCloseQuery kullanımından kaynaklanmaktadır. Remy'nin cevabı, Windows kapatma işleminin varsayılan VCL sonu oturumu mesajı işlemiyle nasıl engelleneceğini anlatıyor. Ve bu da CanClose'un False'a OnCloseQuery olayında ayarlanması nedeniyle oluşur.

Bu geçici çözüm, işi bitirecek ancak bununla başa çıkmak için daha basit bir yol var. Formun kapatılmasını durdurmak yerine, devam edip kapatın. OnCloseQuery etkinliğinizi tamamen kaldırın. Bir OnClose olayı ile değiştirin.

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); 
begin 
    Action := caNone; 
    Visible := False; 
end; 

Bu kod oldukça önemsiz bit ana form kapalı olduğunda uygulamanızın tepsiye için en aza indirmek için yeterli olduğunu. mesajı FALSE dönmek için CanClose=False ayarı OnCloseQuery olay bir WM_QUERYENDSESSION iletiye yanıt olarak tetiklenen ise

+0

Bunun nedeni kodunuzun 'OnCloseQuery' olayını kullanmamasıdır.Bunun yerine, 'OnCloseQuery' gibi' WM_QUERYENDSESSION 'mesajına bağlı olmayan 'OnClose' olayını kullanıyor. –

+0

@Remy Evet, alımda biraz yavaşım, değil mi ?! Burada OnClose'un doğru çözüm olduğu görülüyor. Son oturum iletilerinde hiçbir noktaya rastlanmadı. –

+0

Gerek WM_QUERYENDSESSION gerekse WM_ENDSESSION - WM_CLOSE tetiklendiğinde programı tepsiye yerleştirmek için OnCanCloseQuery'yi zaten kullanıyorum. –

13

, neden olacaktır.

XP ve önceki sürümlerde, Windows kapatma işlemi iptal edilir. Bu noktaya kadar, almış olduğu her uygulama bir WM_QUERYENDSESSION mesajı kendilerini sonlandırmak için değil söz konusu uygulamaları anlatan FALSE ayarlı onun wParam değere sahip bir WM_ENDSESSION mesajı alacaksınız. Bu yüzden uygulamanız Kasete gider ve Windows kapatma sırasında çıkmaz.

Bu davranışı, Windows Vista'da değiştirdi, dolayısıyla uygulamalar artık Windows kapatma işlemini WM_QUERYENDSESSION aracılığıyla iptal edemiyor. Bu nedenle, Windows Vista ve daha sonra uygulamanızı sonlandırır. Bir uygulamanın amaçlarına göre Windows kapatma işlemini durdurması gerekirse, yeni bir API sunulur.

Bu MSDN üzerinde belgelenmiştir: OnCloseQuery nedeniyle Windows kapatma ya da olmamak çağrıldığını olup olmadığını belirlemek, böylece

Application Shutdown Changes in Windows Vista

ne soran yapmak için, doğrudan WM_QUERYENDSESSION mesajı önünü gerekir. Örneğin:

type 
    TForm1 = class(TForm) 
    private 
    procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION; 
    procedure WMEndSession(var Message: TWMEndSession); message WM_ENDSESSION; 
    end; 

var 
    ShuttingDown: Boolean = False; 

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession); 
begin 
    ShuttingDown := True; 
    inherited; 
end; 

procedure TForm1.WMEndSession(var Message: TWMEndSession); 
begin 
    ShuttingDown := Message.EndSession; 
    inherited; 
end; 

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    CanClose := ShuttingDown; 
    if not ShuttingDown then 
    begin 
    // your Tray logic here ... 
    end; 
end; 
+0

Yardım için teşekkürler Remy. Hızlı yanıtını takdir ediyorum. –

+0

David, senin ve Remy'nin çözümleri aynı. Tek ihtiyacım olan bu mesajlar - ve sistem onları gönderdiğinde. İkiniz de bana yardım edersiniz ve ben size PLUS verdim, ama Remy bunu cevap şeklinde yaptı. Ama her iki çözüm de aynı. Fikir (mantık) hemen hemen aynıdır. –

+0

Hayır, cevabım çok farklı. Belki de sayfayı yenilemediniz. Benim yorumum hakkında konuşuyorsun. Remy'nin bu cevabın kodunun ihtiyaç duyduğunuzdan çok daha karmaşık olduğuna inanıyorum. –

İlgili konular