Ошибка: "The name 'Keys' does not exist in the current context"

У меня почему-то не находит имя Keys. Я скачал через менеджер NuGet следующие пакеты:

  • InputSimulation;
  • System.Drawing.Common.

Мой код:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Threading;
using WindowsInput;
using WindowsInput.Native;
using System.Windows.Forms;

class Program
{
    // Настройки
    static int pixelBox = 3;
    static int pixelSens = 40;
    static Color pixelColor = Color.FromArgb(254, 254, 64); // Жëлтый
    static int tapTime = 74;
    static int waitTime = 0;
    static int clicks = 1;
    static bool waiting = false;
    static bool noMovementCheck = true;

    static void Main(string[] args)
    {
        // Основной цикл
        while (true)
        {
            if (IsKeyDown(Keys.Alt)) // Проверка на удержание ALT
            {
                HoldMode();
            }

            Thread.Sleep(1);
        }
    }

    private static bool IsKeyDown(object alt)
    {
        // Какая-то логика
    }

    private static void HoldMode()
    {
        var keys = new[] { Keys.W, Keys.A, Keys.D, Keys.S, Keys.Space };
        bool allKeysNotPressed = true;
    }
}

Но возникает ошибка:

CS0103 Имя "Keys" не существует в текущем контексте.

Что ещё можно сделать?


Ответы (1 шт):

Автор решения: Chaos_Sower

Считывать клавишу Alt без сочетания с другой клавишей — не очень удачная затея, поскольку в консольном приложении сделать это довольно проблематично.

Вот как вы можете поступить:

Вариант 1 — считывать комбинацию клавиши и Alt

Вы можете ожидать от пользователя нажатия комбинации клавиш Alt + любая другая клавиша. Для этого нужно изменить код следующим образом:

class Program
{
    private static void Main()
    {
        while (true)
        {
            Console.WriteLine("Нажмите на комбинацию \"Alt + любая клавиша\" (для выхода нажмите Esc)...");

            ConsoleKeyInfo ConsoleKeyInfo = Console.ReadKey(true);

            if (ConsoleKeyInfo.Key == ConsoleKey.Escape)
            {
                break;
            }

            if ((ConsoleKeyInfo.Modifiers & ConsoleModifiers.Alt) != 0)
            {
                Console.WriteLine("Нажата клавиша Alt вместе с " + ConsoleKeyInfo.Key);
            }

            else
            {
                Console.WriteLine("Нажата клавиша " + ConsoleKeyInfo.Key);
            }
        }
    }
}

Вариант 2 — проверять состояние Alt по таймеру

Вы можете проверять нажатось клавиши Alt в реальном времени с помощью таймера:

using System.Runtime.InteropServices;

class Program
{
    [DllImport("user32.dll")]
    private static extern short GetAsyncKeyState(int vKey);

    const int VK_MENU = 0x12; // код клавиши Alt

    private static void Main()
    {
        Console.WriteLine("Нажмите Alt (для выхода нажмите Esc)...");

        Timer Timer = new(CheckAltKey, null, 0, 100); // Проверка каждые 100 миллисекунд

        while (true)
        {
            if (Console.KeyAvailable && Console.ReadKey(true).Key == ConsoleKey.Escape)
            {
                break;
            }
        }
    }

    private static void CheckAltKey(object? state)
    {
        if (GetAsyncKeyState(VK_MENU) < 0)
        {
            Console.WriteLine("Вы нажали клавишу Alt!");
        }
    }
}
→ Ссылка