Подождите, пока ключ будет выпущен - PullRequest
0 голосов
/ 20 октября 2018

В простой тестовой программе, которую я создал, вы можете увеличить значение на Console.ReadKey().Тем не менее, вы можете удерживать кнопку, и она будет продолжать увеличивать значение.Я хочу, чтобы моя программа ожидала освобождения ключа, поэтому вы не можете удерживать ключ.Как мне это сделать?

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Я думаю, что вам нужно использовать клавиатуру крюк.Используйте класс, как было описано в 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.Поэтому головоломка завершена.У вас есть значение ключа, и вы знаете, что ключ вниз и ключ вверх событий.Таким образом, вы можете сравнить значение ключа при нажатии вниз со значением при отпускании.Например, если у вас было пятикратное увеличение события KeyDown без какого-либо события KeyUp, это означает, что ключ был удержан и некоторое время удерживался.Таким образом, в таких ситуациях вы можете избежать увеличения счетчика.

Однако вы используете консольное приложение, поэтому вам нужно изменить основной метод, как описано в C # глобальная клавиатура, которая открывает форму из консольного приложения

[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();
}
0 голосов
/ 20 октября 2018

Здесь вы можете использовать функцию 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
            }
    
    <pre><code>    [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. Wrap Console.ReadKey() метод.
    Этот метод возвращает ключ только после отпускания кнопки.

    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;
    }
  3. Проверьте метод.

    <code>static void Main(string[] args)
    {
        int i = 0;
        while (true)
        {
            var key = ReadKey();
            if (key == ConsoleKey.UpArrow)
            {
                Console.WriteLine(++i);
            }
        }
    }
0 голосов
/ 20 октября 2018

Попробуйте использовать Control.keyPress() события вместо ReadKey ().

Вот несколько примеров и ссылок

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...