diff --git a/src/EasyWindowsApplication/Core/SystemTray/SystemTrayBroker.cs b/src/EasyWindowsApplication/Core/SystemTray/SystemTrayBroker.cs index 5086efb..70ea003 100644 --- a/src/EasyWindowsApplication/Core/SystemTray/SystemTrayBroker.cs +++ b/src/EasyWindowsApplication/Core/SystemTray/SystemTrayBroker.cs @@ -26,6 +26,7 @@ internal sealed class SystemTrayBroker private bool _disposed; private int _lastHoverTick; + private int _lastMainTapUpTick; // tick del último WM_LBUTTONUP consumido como MainTap private bool _holding; private readonly TapChainCounter _counter = new(); @@ -135,7 +136,13 @@ private nint OnCallback(nint wParam, nint lParam) case WM_RBUTTONUP: if (IsCursorOverIcon()) Fire(typeof(AlternativeTap1)); break; case WM_MBUTTONUP: if (IsCursorOverIcon()) Fire(typeof(AlternativeTap2)); break; case WM.CONTEXTMENU: OnContextMenuKey(); break; - case var m when m == NIN.SELECT || m == NIN.KEYSELECT: Fire(typeof(MainTap)); break; + // NIN.SELECT/KEYSELECT: en VERSION_4 Explorer lo envía junto a WM_LBUTTONUP + // en cada click de ratón. Deduplicar (issue #58): si hay un MainTap de ratón + // reciente dentro del tiempo de doble click, este mensaje es su eco. + case var m when m == NIN.SELECT || m == NIN.KEYSELECT: + if (unchecked(Environment.TickCount - _lastMainTapUpTick) > (int)Win32.GetDoubleClickTime()) + Fire(typeof(MainTap)); + break; case var m when m == NIN.POPUPOPEN: OnHover(); break; } return 0; @@ -213,6 +220,7 @@ private void OnButtonUp() } else { + _lastMainTapUpTick = Environment.TickCount; Fire(typeof(MainTap)); } } diff --git a/src/EasyWindowsApplication/Share/IMenu.cs b/src/EasyWindowsApplication/Share/IMenu.cs index e50d71c..f4b9112 100644 --- a/src/EasyWindowsApplication/Share/IMenu.cs +++ b/src/EasyWindowsApplication/Share/IMenu.cs @@ -3,8 +3,6 @@ namespace EasyWindowsApplication.Share; public interface IMenu : IViewSurface { void Show(); - void ShowAtCursor(); - void ShowAtIcon(); void Hide(); void Close(); } diff --git a/src/Sample/Program.cs b/src/Sample/Program.cs index 2a26ffe..d68d286 100644 --- a/src/Sample/Program.cs +++ b/src/Sample/Program.cs @@ -12,25 +12,15 @@ { ly.Window(iw => iw .Name("MainWindow") - .Title("EWA - TrayMenu Demo") - .Dimensions(420, 200) - .SystemTray(st => st.Tooltip("EWA Demo")) - .Content(c => c - .Spacing(8) - .Padding(8) - .Children(ch => - { - ch.View(lb => lb.Name("LbResult").Text("Boton muestra el mismo menu del tray.")); - ch.View(b => b.Name("BtnCursor").Text("Menu en cursor (testigo)")); - ch.View(b => b.Name("BtnMenu").Text("Mostrar menu (Show inteligente)")); - }) - ) + .Title("EWA - Demo") + .Dimensions(525, 494) + .SystemTray(st => st.Tooltip("EWA - Demo")) ); ly.AlternativeWindow(m => m .Name("TrayMenu") .Content(c => c.Children(ch => { - ch.View(mi => mi.Name("MiShow").Text("Mostrar ventana")); + ch.View(mi => mi.Name("MiShowMainWin").Text("Go to main window")); ch.View(); ch.View(mi => mi.Name("MiExit").Text("Salir")); })) @@ -45,34 +35,12 @@ bh.SystemTray.Visibility(true); }); - // Click derecho en icono del tray -> menu anclado al icono (iconAnchor). - bh.SystemTray.OnInputWithSpatialPosition(() => bh.TrayMenu.Show()); - - - // Doble click izquierdo en icono del tray -> mostrar ventana principal. bh.SystemTray.OnInputWithSpatialPosition(() => bh.MainWindow.Show()); - //bh.SystemTray.OnInputWithSpatialPosition(() => - //{ - // bh.WindowsApplication.TaskbarButtonVisibility(true); - // bh.MainWindow.Visibility(true); - // bh.SystemTray.Visibility(false); - //}); - - // Boton de la ventana principal -> Show() inteligente (issue #53): - // con click real ancla al rect del boton; sin contexto cae a icono/cursor. - bh.BtnMenu.OnInputWithSpatialPosition(() => bh.TrayMenu.Show()); - // Testigo explicito: siempre en cursor, no lee el contexto del disparador. - bh.BtnCursor.OnInputWithSpatialPosition(() => bh.TrayMenu.ShowAtCursor()); + bh.SystemTray.OnInputWithSpatialPosition(() => bh.GalleryMenu.Show()); - bh.MiShow.OnInputWithSpatialPosition(() => bh.MainWindow.Show()); - //bh.MiShow.OnInputWithSpatialPosition(() => - //{ - // bh.WindowsApplication.TaskbarButtonVisibility(true); - // bh.MainWindow.Visibility(true); - // bh.SystemTray.Visibility(false); - //}); bh.MiExit.OnInputWithSpatialPosition(() => bh.WindowsApplication.Terminate()); + bh.MiShowMainWin.OnInputWithSpatialPosition(() => bh.MainWindow.Show()); }) .Initialize();