2010-01-23 15 views

Respuesta

17

Al crear la ventana, omita la marca WS_VISIBLE y no llame a ShowWindow.

+6

MSDN indica que también debe ser una ventana secundaria de HWND_MESSAGE, consulte http://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx#message_only –

+4

Pero no recibe mensajes de difusión . –

3

Usted llama CreateWindow() o CreateWindowEx() como de costumbre, pero no especifica el estilo WS_VISIBLE ventana. Por supuesto, ShowWindow() tampoco debe ser llamado.

+0

El hombre, que tenía exactamente la misma respuesta que yo :) –

+2

Ambos dejado fuera que tiene que ser un hijo de HWND_MESSAGE, http://msdn.microsoft.com/en-us/library/ms632599 (VS.85).aspx # message_only –

+3

No * need * to (* ventanas de solo mensaje * no implica que otros tipos de ventana no puedan enviar mensajes), pero supongo que ahorra gastos generales cuando necesita una ventana de solo mensajes: el OP no especificó eso. –

10

En un entorno Win32/MFC lo que hay que hacer es crear una clase y heredar de CWnd como esto:

class HiddenMsgWindow : public CWnd 
{ 
... 
} 

en el constructor de esa clase que pudiera crear una instancia de una ventana como esta:

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

Esto le consigue una ventana oculta con un mensaje de bomba casi listo para el rock and roll.

el resto de la historia es para proporcionar la vinculación entre los mensajes de la ventana y los controladores para esos mensajes.

Esto se hace mediante la adición de unas macros y un controlador de mensajes a su archivo de implementación (.cpp) de esta manera:

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

Luego hay que rellenar el resto de la cola en el archivo de cabecera como esto:

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

    DECLARE_MESSAGE_MAP() 

} 

Y al igual que la magia, tiene una ventana oculta lista para transmitir sus mensajes.

Para utilizar esta ventana de mensaje, creará una instancia de la clase recuperando su identificador y enviará o publicará mensajes según lo desee. Al igual que este:

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

Lo he editado por ti. Eche un vistazo a la fuente para ver cómo puede formatear varias cosas. :] El código debe sangrarse con cuatro espacios, y usted puede hacer 'código en línea' rodeando el código con back-ticks: \ 'code \' se convierte en 'código'. – GManNickG

+0

+1 internets para HWND_MESSAGE –

0

Ahh, solo se encontró con un problema. Si no puede especificar HWND_MESSAGE, podrían ocurrir comportamientos inesperados. He usado NULL, que NO es correcto. En mi caso, provocó que MS Excel tardara 10 o más en cargar un archivo xls, ¡mientras que normalmente tarda menos de un segundo cuando mi aplicación no se ejecutaba!

MSDN dice esto como alguien mencionado anteriormente.

1

Si no necesita mostrar la ventana, , ya que algunos sugieren crear la ventana, omita la marca WS_VISIBLE y no llame a ShowWindow.

Si no es así cuando se llama SHOWWINDOW(), añadir SW_HIDE parámetro.

ShowWindow(hWnd, SW_HIDE); 
Cuestiones relacionadas