等待密钥被释放

时间:2018-10-20 08:06:41

标签: c# console

在我制作的简单测试程序中,您可以使用Console.ReadKey()来增加值。但是,您可以按住按钮,它只会继续增加值。我希望我的程序等待键被释放,因此您不能按住键。我该怎么办?

3 个答案:

答案 0 :(得分:0)

尝试使用Control.keyPress()事件代替ReadKey()。

以下是一些示例和参考资料

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.control.keypress?view=netframework-4.7.2

答案 1 :(得分:0)

我认为您需要使用键盘挂钩。 使用类,就像已经在 https://social.msdn.microsoft.com/Forums/vstudio/en-US/88ae8842-5301-4b15-830e-1d6282303508/how-to-listen-to-keyboard-inputs?forum=netfxbcl

此类是全局键盘挂钩处理程序。 在处理程序方法“ OnHookCallback”中,您可以执行任何操作。它确实类似于ReadKey()方法。您可以读取所按下的键,写入键的值或执行任何所需的操作。另外,您可以检测到此按键事件是KeyDown或KeyUp。 因此,拼图是完整的。您具有键值,并且知道键按下和键按下事件。因此,您可以将按下时的键值与释放时的键值进行比较。例如,如果您有5次KeyDown事件上升而没有任何KeyUp事件的发生,则意味着该密钥已被保持并保持了一段时间。因此,在这种情况下,您可以避免增加计数器。

但是,您使用的是控制台应用程序,因此您需要按照C# global keyboard hook, that opens a form from a console application

中所述更改主要方法。
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);

    LowLevelKeyboardHook kbh = new LowLevelKeyboardHook();
    kbh.OnKeyPressed += kbh_OnKeyPressed;
    kbh.OnKeyUnpressed += kbh_OnKeyUnpressed;
    kbh.HookKeyboard();

    Application.Run();

    kbh.UnHookKeyboard();
}

答案 2 :(得分:0)

您可以在此处使用GetKeyState功能。

  1. 让我们使用此答案中的修改后的代码https://stackoverflow.com/a/9356006/4631959
    我们将使用ConsoleKey而不是Key,因为我们这里不使用WinForms。

    using System;
    using System.Runtime.InteropServices;
    
    namespace NetFramework
    {
        public static class Keyboard
        {
            [Flags]
            private enum KeyStates
            {
                None = 0,
                Down = 1,
                Toggled = 2
            }
    
    
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
        private static extern short GetKeyState(int keyCode);
    
        private static KeyStates GetKeyState(ConsoleKey key)
        {
            KeyStates state = KeyStates.None;
    
            short retVal = GetKeyState((int)key);
    
            //If the high-order bit is 1, the key is down
            //otherwise, it is up.
            if ((retVal & 0x8000) == 0x8000)
                state |= KeyStates.Down;
    
            //If the low-order bit is 1, the key is toggled.
            if ((retVal & 1) == 1)
                state |= KeyStates.Toggled;
    
            return state;
        }
    
        public static bool IsKeyDown(ConsoleKey key)
        {
            return KeyStates.Down == (GetKeyState(key) & KeyStates.Down);
        }
    
        public static bool IsKeyToggled(ConsoleKey key)
        {
            return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled);
        }
    }
    
    }
  2. 包装 [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] private static extern short GetKeyState(int keyCode); private static KeyStates GetKeyState(ConsoleKey key) { KeyStates state = KeyStates.None; short retVal = GetKeyState((int)key); //If the high-order bit is 1, the key is down //otherwise, it is up. if ((retVal & 0x8000) == 0x8000) state |= KeyStates.Down; //If the low-order bit is 1, the key is toggled. if ((retVal & 1) == 1) state |= KeyStates.Toggled; return state; } public static bool IsKeyDown(ConsoleKey key) { return KeyStates.Down == (GetKeyState(key) & KeyStates.Down); } public static bool IsKeyToggled(ConsoleKey key) { return KeyStates.Toggled == (GetKeyState(key) & KeyStates.Toggled); } } 方法。
    此方法仅在释放按钮时才返回键。

    Console.ReadKey()
  3. 测试方法。

    static ConsoleKey ReadKey()
    {
        var key = Console.ReadKey().Key;    
        //wait while key is pressed
        while (Keyboard.IsKeyDown(key))
        {
        }        
        //flush input stream
        while (Console.KeyAvailable)
            Console.ReadKey(true);        
        return key;
    }