2010-01-23 12 views

Odpowiedz

17

Po utworzeniu okna należy pominąć flagę WS_VISIBLE i nie wywoływać ShowWindow.

+6

MSDN stwierdza, że ​​powinieneś także być okienkiem podrzędnym HWND_MESSAGE, zobacz http://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx#message_only –

+4

Ale wtedy nie otrzymujesz wiadomości rozgłoszeniowych . –

3

Jak zwykle nazywasz CreateWindow() lub CreateWindowEx(), ale nie określaj stylu okna WS_VISIBLE. Oczywiście ShowWindow() również nie powinien być wywoływany.

+0

Man, trzeba było dokładnie taką samą odpowiedź jak ja :) –

+2

Oboje lewo, że trzeba być dzieckiem HWND_MESSAGE, http://msdn.microsoft.com/en-us/library/ms632599 (VS.85).aspx # message_only –

+3

Nie potrzebujesz * do (* tylko okno z komunikatem * nie oznacza, że ​​inne typy okien nie mogą wysyłać wiadomości), ale domyślam się, że zapisuje narzut, gdy potrzebujesz okna tylko z komunikatem - PO tego nie sprecyzował. –

10

W środowisku Win32/MFC, co trzeba zrobić, to utworzyć klasę i dziedziczą cwnd tak:

class HiddenMsgWindow : public CWnd 
{ 
... 
} 

w konstruktorze tej klasy byś instancji okno jak poniżej:

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

To daje ci ukryte okno z pompką wiadomości prawie gotową do rock and rolla.

Dalsza część opowieści ma na celu zapewnienie powiązania między wiadomościami w oknie i procedurami obsługi wiadomości.

Odbywa się to poprzez dodanie kilku makr i funkcji obsługi wiadomości do pliku wdrażania (.cpp) jak poniżej:

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); 
} 

Następnie trzeba wypełnić resztę kleju w pliku nagłówka jak to:

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

    DECLARE_MESSAGE_MAP() 

} 

I podobnie jak magia, masz ukryte okno gotowe do pompowania wiadomości.

Aby użyć tego okna komunikatów, należy utworzyć instancję klasy, aby pobrać uchwyt i wysyłać lub wysyłać wiadomości według potrzeb. Właśnie tak:

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

Edytowałem to dla ciebie. Zobacz źródła, jak formatować różne rzeczy. :] Kod powinien być wcięty o cztery spacje, a ty możesz zrobić "kod śródliniowy", otaczając kod tykami zwrotnymi: \ 'kod \ 'staje się' kodem' . – GManNickG

+0

+1 internet dla HWND_MESSAGE –

0

Ahh, właśnie natknąłem się na problem. Jeśli nie określisz HWND_MESSAGE, mogą wystąpić nieoczekiwane zachowania. Użyłem NULL, który NIE jest poprawny. W moim przypadku spowodowało to, że MS Excel zajął 10 lub więcej sekund, aby załadować plik xls, podczas gdy normalnie zajmuje mniej niż sekundę, gdy moja aplikacja nie była uruchomiona!

MSDN mówi o tym jako o kimś wspomnianym wcześniej.

1

Jeśli nie chcesz wyświetlać okna, , ponieważ niektóre sugerują utworzyć okno, pomiń flagę WS_VISIBLE i nie wywołuj ShowWindow.

Jeśli nie podczas rozmowy ShowWindow(), dodać SW_HIDE parametru.

ShowWindow(hWnd, SW_HIDE);