¿Cómo puedo hacer que un ícono de la bandeja del sistema (área de notificación) reciba mensajes WM_MOUSEWHEEL?

StackOverflow https://stackoverflow.com/questions/90411

  •  01-07-2019
  •  | 
  •  

Pregunta

Quiero ampliar una aplicación existente que creé para que establezca el volumen del mezclador desplazándose con la rueda sobre el ícono del área de notificación.

Hasta donde yo sé, el área de notificación no recibe ningún mensaje WM_MOUSEWHEEL, pero aun así encontré una aplicación que hace exactamente lo que quiero lograr (http://www.actualsolution.com/power_mixer).Al usar WinspectorSpy, noté algunos mensajes extraños que recibe el formulario de la aplicación:0x000003d0 y 0x000003d1, pero no encontré referencias sobre ellos.

¿Alguien tiene alguna idea de cómo podría lograr la funcionalidad deseada?

¿Fue útil?

Solución

Si desea capturar eventos del mouse/teclado fuera de su aplicación, necesitará Ganchos de bajo nivel.

Un buen artículo para principiantes sobre la instalación de un gancho para mouse en Delphi es Cómo enganchar el mouse para capturar eventos fuera de su aplicación en About.com escrito por Zarko Gajic.

El usuario que inicie su aplicación necesitará derechos administrativos para instalar un gancho.

Después de capturar el mensaje, debe determinar si está encima de su ícono en la barra de notificaciones (lo cual puede ser difícil porque no existe una API exacta para obtener su posición en la barra) y luego procesar el evento de desplazamiento.

Otros consejos

Le expliqué sobre el enlace del mouse y mencioné que podría ser difícil ubicar el ícono exacto.Encontré el siguiente artículo sobre cómo ubicar un ícono de bandeja.

CTrayIconPosition: ¿dónde está el icono de mi bandeja? Por Irek Zielinski.Creo que si intentas entender cómo funciona, puedes darle la vuelta y usarlo para verificar si tu mouse está actualmente ubicado sobre tu ícono.

Pero primero debes verificar si el mouse está nivelado en el área de la bandeja.Encontré un código antiguo mío (2005) que ubica la región correcta.

var
 hwndTaskBar, hwndTrayWnd, hwndTrayToolBar : HWND;
 rTrayToolBar : tRect;
begin
 hwndTaskBar  := FindWindowEx (0, 0, 'Shell_TrayWnd', nil);
 hwndTrayWnd  := FindWindowEx (hwndTaskBar , 0, 'TrayNotifyWnd',nil);
 hwndTrayToolBar := FindWindowEx(hwndTrayWnd, 0, 'ToolbarWindow32',nil);

 Windows.GetClientRect(hwndTrayToolBar, rTrayToolBar);
end

Usando este fragmento de código y el conocimiento del artículo mencionado, creo que podrías implementar la funcionalidad que deseas.

No estoy seguro de si esto resolverá el problema, pero podría valer la pena intentarlo como punto de partida.Puede crear una ventana transparente de nivel superior que luego coloque sobre la parte superior del icono de la barra de tareas.Esa ventana de nivel superior recibirá notificaciones del mouse cuando el mouse esté sobre ella.Luego podrá procesarlos según sea necesario.Cómo encontrar la ubicación en la pantalla del ícono de la barra de tareas es algo que no sé y podría ser un problema.

No sé si esto le ayudará, pero en Delphi la biblioteca de mensajes estándar dice:

WM_MOUSEWHEEL = $020A;

También sería útil si nos dijeras qué idioma estás utilizando.

Solo pensé en señalar que Power Mixer captura eventos de la rueda de desplazamiento en toda la barra de tareas, mientras que el clic central del mouse opera solo en el ícono de la bandeja del sistema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top