2012-02-28 38 views
7

Tôi có chương trình MFC này khi tôi giết nó với trình quản lý tác vụ, tôi nhận được một ngoại lệ trên chương trình của tôi và sau đó nó bị treo.Trình quản lý tác vụ giết chương trình của tôi như thế nào?

Tôi muốn nhận sự kiện từ người quản lý tác vụ, khi nó sẽ giết quá trình của tôi và đóng chương trình của tôi một cách duyên dáng.

Tôi hiểu rằng có rất ít phương pháp mà trình quản lý tác vụ đang sử dụng để tiêu diệt quy trình.

1) Từ tab ứng dụng, ai đó đã nói với tôi rằng nó đang gửi tin nhắn WM_CLOSE đến cửa sổ hiển thị chính của ứng dụng của tôi, Và nếu ứng dụng của tôi không ngừng hoạt động sau vài giây, trình quản lý tác vụ sẽ phát hiện nó như không đáp ứng và sử dụng TerminateProcess() trên quy trình của nó.

2) Từ tab quá trình, ai đó đã nói với tôi rằng nó đang sử dụng API cửa sổ TerminateProcess().

Có phương pháp nào khác mà Trình quản lý tác vụ đang sử dụng không?

Tôi có đúng về 2 phương pháp cuối cùng không?

Cảm ơn bạn trước.

Trả lời

8

Có, cả hai điều này là chính xác. Bạn nên trả lời WM_CLOSE để đóng một cách duyên dáng. Điều này có thể đến từ bất cứ đâu, không chỉ quản lý tác vụ (tắt máy chẳng hạn).

MFC thường xử lý WM_CLOSE. Nếu ứng dụng của bạn không phản hồi thì chủ đề chính của bạn phải được thực hiện bằng cách khác, hoặc nhiều khả năng từ mô tả của bạn đang bị lỗi ở đâu đó trong trình xử lý WM_CLOSE.

Bạn có thể gỡ lỗi ứng dụng của mình để tìm nơi ngoại lệ được nâng lên không?

+1

cảm ơn bạn, tôi thực sự không trả lời thư WM_CLOSE đã được Trình quản lý Tác vụ gửi. Tôi đã tìm thấy một EMPTY thực hiện của 'afx_msg void OnClose();' tất cả những gì tôi phải làm là gọi thực hiện lớp cơ sở của OnClose. – eladyanai

1

Khi bạn nhận được WM_CLOSE, bạn có thể dễ dàng phát hiện ra để ứng dụng của bạn có thể hành động theo nó.

Tôi không tin rằng có thể biết khi nào TerminateProcess đang được gọi để hủy đơn đăng ký của bạn. Các tài liệu TerminateProcess nói rằng nó là một tắt máy ngay lập tức và vô điều kiện của quá trình mục tiêu.

(Tùy thuộc vào số tiền bạn muốn đạt được điều này, hãy nhìn vào this link về hooking vào API của Windows nhưng không mong đợi nó sẽ dễ dàng.)

+0

cảm ơn bạn đã trả lời, thực ra, tôi đã không trả lời WM_CLOSE đã được Trình quản lý Tác vụ gửi khi giết quá trình của tôi từ tab Ứng dụng. giết quá trình của tôi từ tab quá trình (bằng chức năng TerminateProcess) đã không làm cho ứng dụng của tôi gặp sự cố. – eladyanai

3

Vâng, đó là những tùy chọn.

Để hoàn thành, lưu ý rằng ứng dụng chế độ bảng điều khiển nhận được CTRL_CLOSE_EVENT gửi mà bạn có thể phản ứng khi nút "Kết thúc tác vụ" được nhấp.

Lưu ý rằng bạn không thể chặn hoặc phản ứng khi TerminateProcess. Quá trình của bạn sẽ chết và bạn không thể làm gì trước khi điều đó xảy ra. Trên thực tế, nó sẽ là pretty bad if you could. Bởi vì sau đó sẽ không có cách nào để chấm dứt một quá trình đã đi haywire.

+0

rất tốt để biết! cảm ơn bạn rất nhiều, và tôi đồng ý về giải thích TerminateProcess. – eladyanai

1

Trình quản lý tác vụ sử dụng nội bộ chức năng EndTask. Chức năng này gửi thông báo WM_CLOSE tới ứng dụng của bạn. Nếu ứng dụng của bạn không trả lời thư đó và người dùng buộc chấm dứt Đơn đăng ký của bạn, thì TerminateProcess sẽ được gọi trong quá trình của bạn.

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