2012-05-22 30 views
5

Vì vậy, tôi có một dll C++, mà tôi đang sử dụng trong ứng dụng C# của mình, để giám sát Windows Messages. Tôi muốn biết nếu WM_CLOSE và WM_QUERYENDSESSION được gửi bởi vì tôi không thể thấy điều đó từ một ứng dụng C#. Nếu tôi nhận được một trong những thông điệp này, tôi muốn làm một số dọn dẹp với các tập tin của tôi nhưng vấn đề là khi tôi giết nó với TM các chức năng không hoạt động. Nó seams rằng tôi không nhận được tin nhắn. Tôi nghĩ vấn đề là Task Manager sẽ gửi một tin nhắn đến ứng dụng C# và không gửi tới C++ dll.Tôi nhận được thông báo gì khi tôi giết chương trình của mình bằng trình quản lý tác vụ

Một số Code:

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#:

[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

Bạn chỉ nhận được WM_CLOSE khi sử dụng tab Ứng dụng trong trình quản lý tác vụ. Giết nó từ tab Processes là một kết thúc thô lỗ. Làm thế nào tin nhắn kết thúc trong mã C + + là rất không rõ ràng, giao diện người dùng thường được thực hiện trong C#. –

+2

Hoặc bạn sẽ nhận được sự kiện 'CTRL_CLOSE_EVENT' trong các ứng dụng bảng điều khiển. Liên kết bắt buộc với bài đăng cũ có liên quan [bài đăng trên blog] (http://blogs.msdn.com/b/oldnewthing/archive/2004/07/22/191123.aspx) –

Trả lời

3

quá trình của bạn sẽ không nhận được bất kỳ tin nhắn trong trường hợp nếu nó đang được giết. Bắt đầu trên TerminateProcess - xem điểm nổi bật của tôi:

Chức năng TerminateProcess được sử dụng vô điều kiện gây ra quá trình thoát. Tình trạng dữ liệu toàn cầu được duy trì bởi các thư viện liên kết động (DLL) có thể bị tổn hại nếu TerminateProcess được sử dụng thay vì ExitProcess.

Chức năng này dừng thực hiện tất cả các chủ đề trong quá trình và yêu cầu hủy bỏ tất cả các cấp phát I/O ...

EDIT: Hans passant bình luận về nhiệm vụ cách chấm dứt - Bạn chỉ nhận được WM_CLOSE khi sử dụng tab Ứng dụng trong trình quản lý tác vụ. Giết nó từ tab Processes là một kết thúc thô lỗ (TerminateProcess).

+0

Và trong trường hợp tắt máy WM_QUERYENDSESSION? – Thanatos

+1

có. Lưu ý phụ về trình quản lý tác vụ: Tôi nghĩ có trường hợp (khi nào?) Khi trình quản lý tác vụ cố gắng dừng quy trình đúng cách trước khi chấm dứt, nhưng tôi chỉ mong đợi TerminateProcess được sử dụng trên quy trình nếu nó quan trọng đối với bạn. –

+0

Sau đó, bạn có biết cách để tìm hiểu xem tắt máy đã được khởi tạo bằng C# chưa? trong winapi tôi đã sử dụng queryendsesion nhưng ở đây? – Thanatos

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