From 68ce47fb09912a4cd26f52287c0fadcabeeb01b1 Mon Sep 17 00:00:00 2001 From: Markus Hofknecht Date: Sun, 15 Mar 2020 16:06:18 +0100 Subject: [PATCH] [Feature] Mouse&Keyboard Selection #38, [Feature] Better colors handling #37, Version 0.9.2.0 --- Handler/KeyboardInput.cs | 12 +++++++++++ Helper/MessageFilter.cs | 12 +++++++++-- MenuDefines.cs | 2 +- Properties/AssemblyInfo.cs | 4 ++-- SystemTrayMenu.cs | 43 +++++++++++++++++++++++++++++++++++--- 5 files changed, 65 insertions(+), 8 deletions(-) diff --git a/Handler/KeyboardInput.cs b/Handler/KeyboardInput.cs index 246711f..1a18ac0 100644 --- a/Handler/KeyboardInput.cs +++ b/Handler/KeyboardInput.cs @@ -24,6 +24,8 @@ namespace SystemTrayMenu.Handler public int iMenuKey = 0; string KeySearchString = string.Empty; + public bool InUse = false; + public KeyboardInput(Menu[] menus) { this.menus = menus; @@ -363,6 +365,16 @@ namespace SystemTrayMenu.Handler return found; } + public void Select(DataGridView dgv, int i) + { + iRowKey = i; + iMenuKey = ((Menu)dgv.TopLevelControl).Level; + DataGridViewRow row = dgv.Rows[i]; + RowData rowData = (RowData)row.Tag; + rowData.IsSelectedByKeyboard = true; + row.Selected = true; + } + private bool Select(DataGridView dgv, int i, string keyInput = "") { diff --git a/Helper/MessageFilter.cs b/Helper/MessageFilter.cs index 916ae87..f7da96b 100644 --- a/Helper/MessageFilter.cs +++ b/Helper/MessageFilter.cs @@ -1,4 +1,5 @@ -using System.Windows.Forms; +using System.Drawing; +using System.Windows.Forms; namespace SystemTrayMenu { @@ -13,6 +14,8 @@ namespace SystemTrayMenu public event EventHandler MouseMove; public event EventHandler ScrollBarMouseMove; + Point cursorPosition = new Point(); + public bool PreFilterMessage(ref Message message) { if (message.Msg == WM_MOUSELEAVE) @@ -21,7 +24,12 @@ namespace SystemTrayMenu } else if (message.Msg == WM_MOUSEMOVE) { - MouseMove?.Invoke(); + Point newCursorPosition = Cursor.Position; + if (!newCursorPosition.Equals(cursorPosition)) + { + MouseMove?.Invoke(); + } + cursorPosition = newCursorPosition; } else if (message.Msg == WM_NCMOUSEMOVE) { diff --git a/MenuDefines.cs b/MenuDefines.cs index 3f04bbf..6367412 100644 --- a/MenuDefines.cs +++ b/MenuDefines.cs @@ -14,7 +14,7 @@ namespace SystemTrayMenu // windows explorer highlighted text public static Color FolderOpen = Color.FromArgb(229, 243, 255); public static Color Background = Color.FromArgb(229, 243, 255); - internal static Color KeyBoardSelection = Color.Yellow; + internal static Color KeyBoardSelection = Color.FromArgb(204, 232, 255); internal static int KeySearchInterval = 1000; public const int MenuRowsHeight = 18; public const int LengthMax = 37; diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index 8771519..8e16864 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.9.1.260")] -[assembly: AssemblyFileVersion("0.9.1.260")] +[assembly: AssemblyVersion("0.9.2.0")] +[assembly: AssemblyFileVersion("0.9.2.0")] diff --git a/SystemTrayMenu.cs b/SystemTrayMenu.cs index 0dd2a0e..2ed2537 100644 --- a/SystemTrayMenu.cs +++ b/SystemTrayMenu.cs @@ -39,6 +39,9 @@ namespace SystemTrayMenu BackgroundWorker worker = new BackgroundWorker(); Screen screen = Screen.PrimaryScreen; + DataGridView dgvFromLastMouseEvent = null; + DataGridViewCellEventArgs cellEventArgsFromLastMouseEvent = null; + public SystemTrayMenu(ref bool cancelAppRun) { log.Info("Application Start " + @@ -63,6 +66,7 @@ namespace SystemTrayMenu keyboardInput.RowSelected += KeyboardInputRowSelected; void KeyboardInputRowSelected(DataGridView dgv, int rowIndex) { + keyboardInput.InUse = true; FadeInIfNeeded(); CheckMenuOpenerStart(dgv, rowIndex); } @@ -206,6 +210,23 @@ namespace SystemTrayMenu } messageFilter.MouseMove += FadeInIfNeeded; + messageFilter.MouseMove += MessageFilter_MouseMove; + void MessageFilter_MouseMove() + { + if (keyboardInput.InUse) + { + CheckMenuOpenerStop(keyboardInput.iMenuKey, + keyboardInput.iRowKey); + keyboardInput.ClearIsSelectedByKey(); + + keyboardInput.InUse = false; + if (dgvFromLastMouseEvent != null) + { + Dgv_MouseEnter(dgvFromLastMouseEvent, + cellEventArgsFromLastMouseEvent); + } + } + } messageFilter.ScrollBarMouseMove += FadeInIfNeeded; messageFilter.MouseLeave += fastLeave.Start; @@ -570,7 +591,16 @@ namespace SystemTrayMenu private void Dgv_MouseEnter(object sender, DataGridViewCellEventArgs e) { DataGridView dgv = (DataGridView)sender; - CheckMenuOpenerStart(dgv, e.RowIndex); + dgvFromLastMouseEvent = dgv; + cellEventArgsFromLastMouseEvent = e; + + if (!keyboardInput.InUse) + { + keyboardInput.ClearIsSelectedByKey(); + keyboardInput.Select(dgv, e.RowIndex); + + CheckMenuOpenerStart(dgv, e.RowIndex); + } } private void CheckMenuOpenerStart(DataGridView dgv, int rowIndex) @@ -611,8 +641,15 @@ namespace SystemTrayMenu private void Dgv_MouseLeave(object sender, DataGridViewCellEventArgs e) { DataGridView dgv = (DataGridView)sender; - Menu menu = (Menu)dgv.FindForm(); - CheckMenuOpenerStop(menu.Level, e.RowIndex, dgv); + + if (!keyboardInput.InUse) + { + Menu menu = (Menu)dgv.FindForm(); + CheckMenuOpenerStop(menu.Level, e.RowIndex, dgv); + } + + dgvFromLastMouseEvent = null; + cellEventArgsFromLastMouseEvent = null; } private void CheckMenuOpenerStop(int menuIndex, int rowIndex, DataGridView dgv = null)