2010-01-23 79 views

Trả lời

17

Khi bạn tạo cửa sổ, hãy bỏ qua cờ WS_VISIBLE và không gọi ShowWindow.

+6

Trạng thái MSDN bạn cũng nên là cửa sổ con của HWND_MESSAGE, hãy xem http://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx#message_only –

+4

Nhưng sau đó bạn không nhận được tin nhắn quảng bá . –

3

Bạn gọi CreateWindow() hoặc CreateWindowEx() như bình thường nhưng không xác định kiểu WS_VISIBLE cửa sổ. Tất nhiên ShowWindow() cũng không nên được gọi.

+0

Man, bạn có câu trả lời chính xác giống như tôi :) –

+2

Cả hai rời ra rằng bạn cần phải là một đứa trẻ của HWND_MESSAGE, http://msdn.microsoft.com/en-us/library/ms632599 (VS.85).aspx # message_only –

+3

Bạn không * cần * tới (* cửa sổ chỉ thông báo * không ngụ ý rằng các loại cửa sổ khác không thể gửi tin nhắn), nhưng tôi đoán nó sẽ tiết kiệm được chi phí khi bạn cần một cửa sổ chỉ nhắn tin - OP không xác định điều đó. –

10

Trong một môi trường win32/MFC những gì bạn cần làm là tạo ra một lớp và kế thừa từ CWnd như thế này:

class HiddenMsgWindow : public CWnd 
{ 
... 
} 

trong constructor của lớp đó bạn sẽ nhanh chóng một cửa sổ như thế này:

HiddenMsgWindow::HiddenMsgWindow() 
{ 
    CString wcn = ::AfxRegisterWndClass(NULL); 
    BOOL created = this->CreateEx(0, wcn, _T("YourExcellentWindowClass"), 0, 0, 0, 0, 0, HWND_MESSAGE, 0); 
} 

Điều này sẽ giúp bạn có một cửa sổ ẩn với một máy bơm tin nhắn gần như đã sẵn sàng để cuộn và cuộn.

phần còn lại của câu chuyện là cung cấp liên kết giữa thông báo cửa sổ và trình xử lý cho các thư đó.

này được thực hiện bằng cách thêm một vài macro và một handler thông điệp tới tập tin của bạn thực hiện (cpp) như thế này:

BEGIN_MESSAGE_MAP(HiddenMsgWindow, CWnd) 
    ON_MESSAGE(WM_USER + 1, DoNOOP) 
END_MESSAGE_MAP() 

LRESULT HiddenMsgWindow::DoNOOP(WPARAM wParam, LPARAM lParam) 
{ 
    AfxMessageBox(_T("Get Reaaady for a Ruuummmmmmmbllllle!")); 
    return LRESULT(true); 
} 

Sau đó, bạn cần phải điền vào phần còn lại của keo trong file header như này:

class HiddenMsgWindow : public CWnd 
{ 
public: 
    HiddenMsgWindow(); 
protected: 
    afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam); 

    DECLARE_MESSAGE_MAP() 

} 

Và giống như ma thuật, bạn có cửa sổ ẩn tất cả đã sẵn sàng để bơm tin nhắn của bạn.

Để sử dụng cửa sổ thông báo này, bạn sẽ nhanh chóng truy xuất lớp đó xử lý và gửi hoặc gửi tin nhắn như mong muốn. Chỉ cần như thế này:

HiddenMsgWindow *hmw = new HiddenMsgWindow(); 
SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0); 
+2

Tôi đã chỉnh sửa nó cho bạn. Hãy xem nguồn để biết cách bạn có thể định dạng nhiều thứ khác nhau. :] Mã sẽ được thụt vào bởi bốn dấu cách và bạn có thể thực hiện 'mã nội tuyến' bằng cách bao quanh mã bằng các dấu tích sau: \ 'code \' trở thành 'mã'. – GManNickG

+0

+1 internets cho HWND_MESSAGE –

0

Ahh, chỉ tình cờ gặp một vấn đề. Nếu u không chỉ định HWND_MESSAGE hành vi bất ngờ có thể xảy ra. Tôi đã sử dụng NULL đó là không chính xác. Trong trường hợp của tôi nó gây ra rằng MS Excel mất 10s hoặc nhiều hơn để tải một tập tin xls, trong khi nó thường mất ít hơn một giây sau khi ứng dụng của tôi không chạy!

MSDN nói điều này là ai đó đã đề cập trước đây.

1

Nếu bạn không cần hiển thị cửa sổ, vì một số đề xuất tạo cửa sổ, bỏ qua cờ WS_VISIBLE và không gọi ShowWindow.

Nếu không, khi bạn gọi showWindow(), thêm tham số SW_HIDE.

ShowWindow(hWnd, SW_HIDE); 
Các vấn đề liên quan