Tooltip en icono la barra de tareas (y casi conseguido)

12/10/2004 - 21:01 por Zephryn Xirdal | Informe spam
Hola otra vez.

Ya casi tengo conseguido lo de mostrar/ocultar el icono en la barra de
tareas a través de una DLL hecha en C con el API nativo del Win32.

El problema viene ahora de que es imposible comunicar a la aplicación los
mensajes WM_USER que me genera windows a la aplicación.

Añadir un filtro de mensajes con Application.AddMessageFilter no funciona,
porque captura algunos mensajes pero en concreto los WM_USER, no, y no es
cuestión de enviarle otro mensaje y procesarlo yo.

¿Solución?

Añadir un hook a nivel de API a la ventana principal y capturar el mensaje
de WM_USER y si tiene los parámetros concretos, enviarle a la aplicación un
mensaje que la despierte de su estado "oculto":

LRESULT CALLBACK m_wndProcFilter(int nCode,WPARAM wParam,LPARAM lParam)

{

if (nCode < 0) // do not process message

return 0;

CWPSTRUCT *p=(CWPSTRUCT *)lParam;

if(p->message==WM_MYNOTIFYICON && p->hwnd==m_hwnd &&
p->lParam==WM_LBUTTONDOWN)

{

PostMessage(m_hwnd,WM_SHOWWINDOW,TRUE,0);

return 1;

}

return 0;

}

El problema es que no sé qué mensaje enviar para que pase de No Visible a
Visible, que pienso sería lo correcto (porque el cambiar la propiedad
Visible de true a false y viceversa debe generar una secuenca de mensajes).
He probado unos cuantos, pero ninguno la despierta...

Me queda enviar un WM_CHAR con la tecla más extraña que se me ocurra y
capturar ese mensaje, cosa que me parece un verdadera barbaridad, teniendo
en cuenta que la DLL y el EXE están en el mismo espacio de direcciones, lo
comparten todo, pero son incapaces de comunicarse entre sí...

También me queda la opción de la ingeniería inversa (completamente legal en
este caso), pero no tengo ganas...

¿Dónde está documentado todo lo que falta del .NET? Porque 1.821.342.490
bytes de texto comprimido dan para mucho...

La verdad es que estoy bastante cansado ya del tema, y me parece que voy a
abandonar por lo menos el C# y el .NET

Saludos a todos, si a alguien se le ocurre algo, pues le agradecería que me
lo dijera, pero pienso que no vale la pena tanto lío para un programa chorra
que lo único que intenta utilizar en una ínfima parte de lo que la
programación windows puede ofrecer...
El mundo no fue hecho en el tiempo, sino con el tiempo.
Powered by zxFortune http://sourceforge.net/projects/zxfortune
 

Leer las respuestas

#1 Guillermo guille
12/10/2004 - 21:13 | Informe spam
Una duda... si estás usando C# (y .NET) ¿por qué no usas lo que el .NET te
ofrece para trabajar con los iconos de la barra de tareas? o es que me he
perdido algo...

Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"Zephryn Xirdal" wrote in message
news:
Hola otra vez.

Ya casi tengo conseguido lo de mostrar/ocultar el icono en la barra de tareas
a través de una DLL hecha en C con el API nativo del Win32.

El problema viene ahora de que es imposible comunicar a la aplicación los
mensajes WM_USER que me genera windows a la aplicación.

Añadir un filtro de mensajes con Application.AddMessageFilter no funciona,
porque captura algunos mensajes pero en concreto los WM_USER, no, y no es
cuestión de enviarle otro mensaje y procesarlo yo.

¿Solución?

Añadir un hook a nivel de API a la ventana principal y capturar el mensaje de
WM_USER y si tiene los parámetros concretos, enviarle a la aplicación un
mensaje que la despierte de su estado "oculto":

LRESULT CALLBACK m_wndProcFilter(int nCode,WPARAM wParam,LPARAM lParam)

{

if (nCode < 0) // do not process message

return 0;

CWPSTRUCT *p=(CWPSTRUCT *)lParam;

if(p->message==WM_MYNOTIFYICON && p->hwnd==m_hwnd &&
p->lParam==WM_LBUTTONDOWN)

{

PostMessage(m_hwnd,WM_SHOWWINDOW,TRUE,0);

return 1;

}

return 0;

}

El problema es que no sé qué mensaje enviar para que pase de No Visible a
Visible, que pienso sería lo correcto (porque el cambiar la propiedad Visible
de true a false y viceversa debe generar una secuenca de mensajes). He
probado unos cuantos, pero ninguno la despierta...

Me queda enviar un WM_CHAR con la tecla más extraña que se me ocurra y
capturar ese mensaje, cosa que me parece un verdadera barbaridad, teniendo en
cuenta que la DLL y el EXE están en el mismo espacio de direcciones, lo
comparten todo, pero son incapaces de comunicarse entre sí...

También me queda la opción de la ingeniería inversa (completamente legal en
este caso), pero no tengo ganas...

¿Dónde está documentado todo lo que falta del .NET? Porque 1.821.342.490
bytes de texto comprimido dan para mucho...

La verdad es que estoy bastante cansado ya del tema, y me parece que voy a
abandonar por lo menos el C# y el .NET

Saludos a todos, si a alguien se le ocurre algo, pues le agradecería que me
lo dijera, pero pienso que no vale la pena tanto lío para un programa chorra
que lo único que intenta utilizar en una ínfima parte de lo que la
programación windows puede ofrecer...
El mundo no fue hecho en el tiempo, sino con el tiempo.
Powered by zxFortune http://sourceforge.net/projects/zxfortune



Preguntas similares