Skip to content

fix: SystemTray MainTap TwoTap se dispara con un solo click #58

Closed

Description

@cl2raul66

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

  1. Usar src/Sample/Program.cs con ventana principal + SystemTray(Tooltip) + TrayMenu.
  2. Agregar en Behavior el bloque OnLaunched de src/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);
});
  1. Suscribir bh.SystemTray.OnInputWithSpatialPosition<MainTap, TwoTap>(() => { ... mostrar ventana ... });.
  2. 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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    fixCorrección de error (Patch bump).

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions