Repository navigation
fix: SystemTray MainTap TwoTap se dispara con un solo click #58
Description
Plan de Implementación
- Revisar conteo de taps en broker/hub del SystemTray (MainTap TwoTap vs OneTap)
- Reproducir con Sample Program.cs (tray + doble click)
- Corregir dispatch y verificar Click simple / Doble click / Click derecho
Descripción del Error
Con bh.SystemTray.OnInputWithSpatialPosition<MainTap, TwoTap>(...) basta un solo click físico para que se dispare el handler. Debería requerir doble click (TwoTap). El handler alternativo con MainWindow.Show() directo fue reemplazado por el bloque TaskbarButtonVisibility/MainWindow.Visibility/SystemTray.Visibility en src/Sample/Program.cs:31-36, que sí funciona pero también con un solo click.
Pasos para reproducir
- Usar
src/Sample/Program.cscon ventana principal +SystemTray(Tooltip)+TrayMenu. - Agregar en
Behaviorel bloqueOnLauncheddesrc/Sample/Program.cs:31-36(sin él el icono del tray jamás aparece):
bh.WindowsApplication.OnLaunched(wa =>
{
wa.TaskbarButtonVisibility(false);
bh.MainWindow.Visibility(false);
bh.SystemTray.Visibility(true);
});- Suscribir
bh.SystemTray.OnInputWithSpatialPosition<MainTap, TwoTap>(() => { ... mostrar ventana ... });. - Ejecutar Sample, hacer un solo click izquierdo en el icono del tray: la ventana principal se muestra (incorrecto, debería exigir doble click).
Causa raíz y fix aplicado
En src/EasyWindowsApplication/Core/SystemTray/SystemTrayBroker.cs, OnCallback() despachaba MainTap por dos vías con NOTIFYICON_VERSION_4: WM_LBUTTONUP → OnButtonUp() → Fire(MainTap), y además NIN.SELECT/NIN.KEYSELECT → Fire(MainTap). Explorer reporta cada click izquierdo dos veces (mensaje clásico de ratón + NIN.SELECT), y TapChainCounter.Next() los encadenaba (mismo trigger dentro de GetDoubleClickTime()) → count 1 y luego 2, disparando OneTap y TwoTap con un solo click.
Fix: se registra el tick del último WM_LBUTTONUP (_lastMainTapUpTick) y el eco NIN.SELECT/NIN.KEYSELECT se descarta si hay un MainTap de ratón reciente dentro del tiempo de doble click. La selección por teclado no genera WM_LBUTTONUP, por lo que sigue disparando MainTap correctamente. WM_LBUTTONDBLCLK se ignora a propósito: el doble tap se codifica como cadena en el segundo WM_LBUTTONUP.
Severidad
Media (Funcionalidad rota pero con workaround)
Contexto adicional
- Click derecho
AlternativeTap1, OneTap->TrayMenu.Show()funciona bien. MiShow-> mostrar ventana funciona bien.- Rama actual:
58-fix-systemtray-maintap-twotap-se-dispara-con-un-solo-click.
Activity
fix(systemtray): deduplicar eco NIN.SELECT tras WM_LBUTTONUP — #58