Browse Source

Using GetNumberOfConsoleInputEvents and FlushConsoleInputBuffer to clear input events.

BDisp 1 year ago
parent
commit
b59c5ea9e6
1 changed files with 35 additions and 0 deletions
  1. 35 0
      Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

+ 35 - 0
Terminal.Gui/ConsoleDrivers/WindowsDriver.cs

@@ -838,6 +838,29 @@ internal class WindowsConsole
     [DllImport ("kernel32.dll", SetLastError = true)]
     [DllImport ("kernel32.dll", SetLastError = true)]
     private static extern bool GetNumberOfConsoleInputEvents (nint handle, out uint lpcNumberOfEvents);
     private static extern bool GetNumberOfConsoleInputEvents (nint handle, out uint lpcNumberOfEvents);
 
 
+    internal uint GetNumberOfConsoleInputEvents ()
+    {
+        if (!GetNumberOfConsoleInputEvents (_inputHandle, out uint numOfEvents))
+        {
+            Console.WriteLine ($"Error: {Marshal.GetLastWin32Error ()}");
+
+            return 0;
+        }
+
+        return numOfEvents;
+    }
+
+    [DllImport ("kernel32.dll", SetLastError = true)]
+    private static extern bool FlushConsoleInputBuffer (nint handle);
+
+    internal void FlushConsoleInputBuffer ()
+    {
+        if (!FlushConsoleInputBuffer (_inputHandle))
+        {
+            Console.WriteLine ($"Error: {Marshal.GetLastWin32Error ()}");
+        }
+    }
+
     public InputRecord [] ReadConsoleInput ()
     public InputRecord [] ReadConsoleInput ()
     {
     {
         const int bufferSize = 1;
         const int bufferSize = 1;
@@ -2132,6 +2155,18 @@ internal class WindowsMainLoop : IMainLoopDriver
     {
     {
         _inputHandlerTokenSource?.Cancel ();
         _inputHandlerTokenSource?.Cancel ();
         _inputHandlerTokenSource?.Dispose ();
         _inputHandlerTokenSource?.Dispose ();
+
+        if (_winConsole is { })
+        {
+            var numOfEvents = _winConsole.GetNumberOfConsoleInputEvents ();
+
+            if (numOfEvents > 0)
+            {
+                _winConsole.FlushConsoleInputBuffer ();
+                //Debug.WriteLine ($"Flushed {numOfEvents} events.");
+            }
+        }
+
         _waitForProbe?.Dispose ();
         _waitForProbe?.Dispose ();
 
 
         _resultQueue?.Clear ();
         _resultQueue?.Clear ();