2012-05-22 22 views
5

ile öldürdüğümde aldığım hangi ileti var? C++ uygulamasında, Windows İletilerini izlemek için C# uygulamasında kullanıyorum. WM_CLOSE ve WM_QUERYENDSESSION öğelerinin gönderilip gönderilmediğini bilmek istiyorum çünkü C# uygulamasından bunu göremiyorum. Bu iletilerden birini alırsam, dosyalarımla bazı temizleme yapmak istiyorum, ancak sorun, TM ile çalışırken onu öldürmüyorum. Mesajları anlamadığımı söylüyor. Sorun şu ki, Görev Yöneticisi C++ uygulamasına C++ uygulamasına bir ileti göndermiyor.Programımı görev yöneticisi

Bazı Kodu:

C++:

typedef void (*CLOSING_FUNCTION)(); 
CLOSING_FUNCTION myClosingFunction; 

typedef void (*SHUTDOWN_FUNCTION)(); 
SHUTDOWN_FUNCTION myShutdownFunction; 

LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch(message) 
    { 

    case WM_CREATE: 
     return 0; 

    case WM_CLOSE: 
     myClosingFunction(); 
     return 0; 

    case WM_QUERYENDSESSION: 
     myShutdownFunction(); 
     return 1; 

    case WM_DESTROY: 
     myClosingFunction(); 
     PostQuitMessage(0); 
     return 0; 
    } 

    return DefWindowProc(hwnd, message, wParam, lParam); 
} 

C#: Ölen olup olmadığını

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void Close_Function(); 
private static Close_Function myCloseDelegate; 

[UnmanagedFunctionPointer(CallingConvention.Cdecl)] 
private delegate void Shutdown_Function(); 
private static Shutdown_Function myShutdownDelegate; 
static void StartMonotoring() 
{ 
     myCloseDelegate = Close; 
     myShutdownDelegate = Shutdown; 

     InterceptMessages(myCloseDelegate, myShutdownDelegate); 
} 

static void Close(); 
static void Shutdown(); 
+2

Görev yöneticisinde Uygulamalar sekmesini kullanırken yalnızca WM_CLOSE elde edersiniz. İşlemler sekmesinden onu öldürmek kaba bir sonlandırmadır. C++ kodunda mesajın nasıl sonlandığı belirsizdir, kullanıcı arayüzü genellikle C# ile yapılır. –

+2

Veya konsol uygulamalarında bir 'CTRL_CLOSE_EVENT' olayı alırsınız. İlgili eski mesajlara zorunlu bağlantı [blog yazısı] (http://blogs.msdn.com/b/oldnewthing/archive/2004/07/22/191123.aspx) –

cevap

3

Sizin süreç halinde herhangi bir mesaj almazsınız. TerminateProcess ile başlayın - vurgularıma bakın:

TerminateProcess işlevi, bir işlemin koşulsuz olarak çıkmasına neden olmak için kullanılır. ExitProcess yerine TerminateProcess kullanılırsa dinamik bağlantı kitaplıkları (DLL) tarafından korunan global verilerin durumu tehlikeye girebilir.

süreci içindeki tüm iş parçacıkları yürütülmesini durdurur ve tüm bekleyen G/Ç ...

DÜZENLEME iptalini talep Bu fonksiyon: sonlandırıldı yolu görevler üzerinde Hans Passant comment - kullanırken yalnızca WM_CLOSE olsun Görev yöneticisinde Uygulamalar sekmesi. İşlemler sekmesinden onu öldürmek kaba bir sonlandırmadır (TerminateProcess).

+0

Ve WM_QUERYENDSESSION başlatılmış bir kapatma durumunda? – Thanatos

+1

evet. Görev yöneticisi üzerinde yan not: Görev yöneticisinin, sonlandırmadan önce süreci düzgün bir şekilde durdurmaya çalıştığı durumlar (sanırım?) Olduğunu düşünüyorum, ancak TerminateProcess'in sizin için önemliyse, süreçte kullanılmasını beklerim. –

+0

Sonra kapatma C# kullanılarak başlatılmış olup olmadığını öğrenmek için bir yol biliyor musunuz? winapi'de sorguendisyonu kullandım ama burada? – Thanatos

İlgili konular