C Обнаружение, когда пользователь печатает

мне было интересно, есть ли способ в C определить, когда пользователь печатает. Я на самом деле прочитал этот пост C обнаружить символы, вводимые пользователем в стандартный ввод, но я не могу найти способ переключить мою консоль из линейного режима в символьный режим в ОС Windows...

Является ли библиотека «ncurses», как было сказано, единственным способом сделать это?... Разве я не могу просто создать поток, который наблюдает за «входным» потоком, как в java?

Мне нужен только «обработчик событий», остальная часть моего кода будет отправлять сообщение клиенту через Winsock, например «USER_NAME печатает», например Whatsapp...

есть ли способ сделать это?

Используете ОС Windows?

ryyker 18.12.2020 18:36

Да, в линуксе по ссылке показано, как это сделать, но не в винде (ОС)

Simone De Luca 18.12.2020 18:39

Вы можете попробовать это projectpluto.com/win32a.htm

klutt 18.12.2020 18:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
360
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы используете Windows, вы можете использовать GetAsyncKeyState(). Он определен и реализован в Windows.h и реализован с использованием User32.lib и User32.dll. Он не только обнаруживает нажатия клавиш, но также предоставляет информацию о состоянии клавиши и порядке нажатия клавиш:

Определяет, нажата ли клавиша в момент активации функции. вызываемый, и была ли клавиша нажата после предыдущего вызова GetAsyncKeyState.

Он также способен обрабатывать последовательности нажатий клавиш, в том числе виртуальных клавиш, как показано ниже:

Краткий пример:

short state=0;
short state1=0;

state = GetAsyncKeyState(VK_CONTROL);
if (0x80000000 & state) //check instantaineous state of key
{
    state = GetAsyncKeyState(VK_SHIFT); 
    if (0x80000000 & state) //check instantaneous state of key
    {
        state = GetAsyncKeyState('h'); 
        state1 = GetAsyncKeyState('H'); 
        if ((0x80000000 & state) || 
            (0x80000000 & state1))

Этот конкретный пример является выдержкой для перехвата последовательностей измененных нажатий клавиш, но эту функцию можно использовать для простого перехвата любой нажатой клавиши.

Итак, с помощью этого кода я узнаю, нажмет ли пользователь клавишу, а затем отправит мое сообщение, верно? Я полагаю, что мне понадобится поток для этого право?

Simone De Luca 18.12.2020 18:43

@SimoneDeLuca - в моей реализации мне не нужно было использовать отдельный поток. Для моих целей я просто запустил его, чтобы позволить пользователю устанавливать состояния. Но да, его также можно использовать в отдельном потоке.\

ryyker 18.12.2020 18:46
Ответ принят как подходящий

Похоже, "kbhit" может сработать для вас. Для этого есть пример.

Это хорошее решение. Однако ответ был бы намного лучше, если бы был включен небольшой пример кода. Это предотвращает бесполезность ответов, когда/если ссылка устареет.

ryyker 18.12.2020 18:54

Инан, большое спасибо, я думаю, что выберу ваш код, а не код @ryyker, потому что мне нужно знать, нажата ли ЛЮБАЯ КЛАВИША на клавиатуре, а не КОНКРЕТНАЯ КЛАВИША, как того требует метод GetAsyncKeyState. Я помещу это в поток, запущенный перед инструкцией scanf. Скажите, пожалуйста, может ли это быть хорошим решением, на ваш взгляд...

Simone De Luca 18.12.2020 18:57

Лично я не очень часто использую функцию khbit, просто видел ее некоторое время назад. Ваше следующее решение может быть немного сложным, но должно работать. Рад, что это помогло. И вы правы, @ryyker, на этот раз я не хотел копировать и вставлять другое существующее решение, но в следующий раз я улучшу свои решения, спасибо.

İnan Uygur 19.12.2020 11:24

Если вам интересно, я не голосую против. В этом случае, поскольку kbhit() легко найти, он не заслуживает отрицательного голосования IMO. Но предложение включить пример, а не ссылку, было предложено, потому что большинство людей, которые часто посещают этот сайт, считают это важным. Как объяснили - ссылки пропадают. Кстати, нет ничего плохого в том, чтобы вырезать и вставлять пример с другого сайта, если этому сайту дают кредит. Этот ответ будет посещаться снова и снова. Если вы немного улучшите его, у него будет больше шансов получить больше голосов.

ryyker 19.12.2020 16:39

Другие вопросы по теме