Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/67: Рейтинг темы: голосов - 67, средняя оценка - 4.87
 Аватар для FireOwl
62 / 44 / 14
Регистрация: 01.07.2009
Сообщений: 145

Консольное приложение. Состояние клавиш клавиатуры

17.07.2010, 04:37. Показов 12490. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно ли в консольном приложении на C# обеспечить контроль состояния клавиатурных клавиш?

Необходимо, чтобы цикл "крутился", программа выполнялась, но реагировала на нажатия клавиш.
Console.ReadKey() не подходит - эта функция ожидает нажатия.

Не мудрствуя лукаво скажу - я делаю игру, и хочу сделать управление стрелками.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.07.2010, 04:37
Ответы с готовыми решениями:

Консольное приложение. Блокировка клавиш
Всем привет,сразу к делу: using System; class Program { static void Main() { Metka: char answer; ...

разработать консольное приложение для ввода с клавиатуры массива строк и поиска среди них строк, содержащих заданный строковый фрагмент.
Помогите пожалуйстааа!!! Не пойму как это сделать на C#. Контрольное задание Необходимо разработать консольное приложение для...

Как открыть консольное приложение в .NET через другое консольное приложение .NET
Есть один вопрос. Как открыть консольное приложение .NET через другое консольное приложение .NET, чтобы при этом второе приложение...

4
Заблокирован
17.07.2010, 08:03
Цитата Сообщение от FireOwl Посмотреть сообщение
Console.ReadKey() не подходит - эта функция ожидает нажатия.
Почему это не подходит? Вот тебе пример из книги
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
class ReadKeys
{
    static void Main()
    {
        ConsoleKeyInfo keypress;
        Console.WriteLine("Введите несколько символов, " +
        "а по окончании - <Q>.");
        do
        {
            keypress = Console.ReadKey(); // считать данные о нажатых клавишах 
            Console.WriteLine(" Вы нажали клавишу: " +
            keypress.KeyChar);
            // Проверить нажатие модифицирующих клавиш. 
            if ((ConsoleModifiers.Alt & keypress.Modifiers) != 0)
                Console.WriteLine("Нажата клавиша <Alt>.");
            if ((ConsoleModifiers.Control & keypress.Modifiers) != 0)
                Console.WriteLine("Нажата клавиша <Control>.");
            if ((ConsoleModifiers.Shift & keypress.Modifiers) != 0)
                Console.WriteLine("Нажата клавиша <Shift>.");
        } while (keypress.KeyChar != 'Q');
    }
}
0
 Аватар для FireOwl
62 / 44 / 14
Регистрация: 01.07.2009
Сообщений: 145
17.07.2010, 19:03  [ТС]
Извиняюсь, я не совсем понятно объяснил проблему...

Нет, Console.ReadKey() как раз не подходит.
Она ожидает нажатия пользователем клавиши.

Мне нужно чтобы программа не ожидала нажатия клавиши.
Только проверила состояние (нажато/не нажато) и дальше "пошла".

Пример:
Допустим, на экране постоянно увеличивающаяся цифра, а я имею возможность нажать на пробел
и остановить увеличение.
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
17.07.2010, 21:14
вот. по нажатию пробела останавливается/возобновляется увеличение счетчика и его вывод на консоль.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Threading;
 
namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
 
            ManualResetEvent idleAcceptedEvent = new ManualResetEvent(true);
            ManualResetEvent exitAcceptedEvent = new ManualResetEvent(false);
 
            new Action(() => {
                for (int cnt = 0; ; cnt++) {
                    idleAcceptedEvent.WaitOne();
                    Console.Clear();
                    Console.WriteLine(cnt);
                    Thread.Sleep(500);
                }
            }).BeginInvoke(null, null);
 
            new Action(() => {
                bool active = false;
                for (; ; ) {
                    ConsoleKeyInfo info = Console.ReadKey();
                    if (info.Key == ConsoleKey.Spacebar)
                        if (active = !active)
                            idleAcceptedEvent.Reset();
                        else idleAcceptedEvent.Set();
                    else if (info.Key == ConsoleKey.Escape)
                        exitAcceptedEvent.Set();
                }
            }).BeginInvoke(null, null);
 
            exitAcceptedEvent.WaitOne();
 
        }
 
    }
}
не уверен, что это поможет...

Добавлено через 1 час 22 минуты
так короче и, следовательно, понятней
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Threading;
 
namespace ConsoleApplication2 {
    class Program {
        static void Main(string[] args) {
 
            ManualResetEvent idleAcceptedEvent = new ManualResetEvent(true);
 
            new Action(() => {
                for (int cnt = 0; ; cnt++) {
                    idleAcceptedEvent.WaitOne();
                    Console.Clear();
                    Console.WriteLine(cnt);
                    Thread.Sleep(50);
                }
            }).BeginInvoke(null, null);
 
            bool active = false;
            for (; ; ) {
                ConsoleKeyInfo info = Console.ReadKey();
                if (info.Key == ConsoleKey.Spacebar)
                    if (active = !active)
                        idleAcceptedEvent.Reset();
                    else idleAcceptedEvent.Set();
                else if (info.Key == ConsoleKey.Escape)
                    return;
            }
 
        }
 
    }
}
3
 Аватар для FireOwl
62 / 44 / 14
Регистрация: 01.07.2009
Сообщений: 145
18.07.2010, 00:52  [ТС]
Помогло! Спасибо.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
 
namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            int x = 0;
            double m = 0;
 
            ManualResetEvent idleAcceptedEvent = new ManualResetEvent(true);
 
            Console.WindowWidth = 40; Console.BufferWidth = 40;
            Console.WindowHeight = 30; Console.BufferHeight = 30;
            Console.ForegroundColor = ConsoleColor.Green;
 
            new Action(() =>
            {
                while(true)
                {
                    idleAcceptedEvent.WaitOne();
                    m += 0.1;
                    if (m > 25.0) m = 0.0;
                    x = 20 + (int)(Math.Sin(m) * 20.0);
                    Console.Clear();
                    Console.SetCursorPosition(x, 15);
                    Console.Write("#");
                    Thread.Sleep(60);
                }
            }   ).BeginInvoke(null, null);
 
            bool active = false;
            for (;;)
            {
                ConsoleKeyInfo info = Console.ReadKey(true);
                
                if (info.Key == ConsoleKey.Spacebar)
                    if (active = !active)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        //idleAcceptedEvent.Reset();
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Green;
                        //idleAcceptedEvent.Set();
                    }
                else if (info.Key == ConsoleKey.Escape)
                    return;
            }
        }
 
    }
}
Будет ли правильным, если в Action я помещу весь нужный мне игровой код, а "снаружи" оставлю только обработку клавиш? Или так лучше не делать?
С точки зрения, так сказать, грамотного кода?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2010, 00:52
Помогаю со студенческими работами здесь

Консольное приложение Заменяет во введенной с клавиатуры строке цифры (0-9) словами «ноль», «один», …, «девять»
Помогите, пожалуйста, необходимо написать консольное приложение для решения такой задачи Заменяет во введенной с клавиатуры строке цифры...

консольное приложение (при запуске приложение открывалось на весь экран)
Как сделать, чтобы при запуске приложение открывалось на весь экран?

Не могу перенести консольное приложение C++ на приложение WindowsForm
Не могу разобраться, как перенести данное приложение из консоли на форму #include &lt;math.h&gt; #include &lt;conio.h&gt; #include...

Как переделать консольное приложение в приложение с GUI?
Есть приложение, работающее в консоли, захотелось сделать с графическим интерфейсом, уперся в непонимание) Объясните, как: а) заменить...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru