porque - temas para dev c++
Cómo crear una ventana oculta en C++ (6)
¿Cómo crear una ventana oculta?
El propósito de esta ventana es recibir algunos mensajes.
Ahh, acabo de enterarme de 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.
Cuando crea la ventana, omita el indicador WS_VISIBLE y no llame a ShowWindow.
En un entorno win32 / mfc, lo que debes hacer es crear una clase y heredar de CWnd de esta manera:
class HiddenMsgWindow : public CWnd
{
...
}
en el constructor de esa clase 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 te da una ventana oculta con un mensaje de bomba casi listo para el rock and roll.
el resto de la historia es proporcionar el vínculo entre los mensajes de la ventana y los controladores para esos mensajes.
Esto se hace agregando unas pocas macros y un manejador 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 debe completar el resto del engrudo en el archivo de encabezado como este:
class HiddenMsgWindow : public CWnd
{
public:
HiddenMsgWindow();
protected:
afx_msg LRESULT DoNOOP(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
}
Y al igual que la magia, tienes una ventana oculta lista para transmitir tus mensajes.
Para usar esta ventana de mensaje, crea una instancia de la clase recuperando su identificador y enviando o publicando mensajes como lo desee. Solo así:
HiddenMsgWindow *hmw = new HiddenMsgWindow();
SendMessage(hmw->m_hWnd, WM_USER + 1, 0, 0);
Llama a CreateWindow()
o CreateWindowEx()
como de costumbre, pero no especifica el estilo de ventana WS_VISIBLE
. Por supuesto, ShowWindow()
tampoco debería ser llamado.
Puedes seguir las instrucciones aquí: msdn.microsoft.com/en-us/library/…
Si no necesita mostrar la ventana, ya que algunos sugieren crear la ventana, omita el indicador WS_VISIBLE y no llame a ShowWindow.
De lo contrario, cuando llame a showWindow () , agregue el parámetro SW_HIDE .
ShowWindow(hWnd, SW_HIDE);