мне было интересно, есть ли способ в C определить, когда пользователь печатает. Я на самом деле прочитал этот пост C обнаружить символы, вводимые пользователем в стандартный ввод, но я не могу найти способ переключить мою консоль из линейного режима в символьный режим в ОС Windows...
Является ли библиотека «ncurses», как было сказано, единственным способом сделать это?... Разве я не могу просто создать поток, который наблюдает за «входным» потоком, как в java?
Мне нужен только «обработчик событий», остальная часть моего кода будет отправлять сообщение клиенту через Winsock, например «USER_NAME печатает», например Whatsapp...
есть ли способ сделать это?
Да, в линуксе по ссылке показано, как это сделать, но не в винде (ОС)
Вы можете попробовать это projectpluto.com/win32a.htm
Если вы используете 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))
Этот конкретный пример является выдержкой для перехвата последовательностей измененных нажатий клавиш, но эту функцию можно использовать для простого перехвата любой нажатой клавиши.
Итак, с помощью этого кода я узнаю, нажмет ли пользователь клавишу, а затем отправит мое сообщение, верно? Я полагаю, что мне понадобится поток для этого право?
@SimoneDeLuca - в моей реализации мне не нужно было использовать отдельный поток. Для моих целей я просто запустил его, чтобы позволить пользователю устанавливать состояния. Но да, его также можно использовать в отдельном потоке.\
Похоже, "kbhit" может сработать для вас. Для этого есть пример.
Это хорошее решение. Однако ответ был бы намного лучше, если бы был включен небольшой пример кода. Это предотвращает бесполезность ответов, когда/если ссылка устареет.
Инан, большое спасибо, я думаю, что выберу ваш код, а не код @ryyker, потому что мне нужно знать, нажата ли ЛЮБАЯ КЛАВИША на клавиатуре, а не КОНКРЕТНАЯ КЛАВИША, как того требует метод GetAsyncKeyState. Я помещу это в поток, запущенный перед инструкцией scanf. Скажите, пожалуйста, может ли это быть хорошим решением, на ваш взгляд...
Лично я не очень часто использую функцию khbit, просто видел ее некоторое время назад. Ваше следующее решение может быть немного сложным, но должно работать. Рад, что это помогло. И вы правы, @ryyker, на этот раз я не хотел копировать и вставлять другое существующее решение, но в следующий раз я улучшу свои решения, спасибо.
Если вам интересно, я не голосую против. В этом случае, поскольку kbhit()
легко найти, он не заслуживает отрицательного голосования IMO. Но предложение включить пример, а не ссылку, было предложено, потому что большинство людей, которые часто посещают этот сайт, считают это важным. Как объяснили - ссылки пропадают. Кстати, нет ничего плохого в том, чтобы вырезать и вставлять пример с другого сайта, если этому сайту дают кредит. Этот ответ будет посещаться снова и снова. Если вы немного улучшите его, у него будет больше шансов получить больше голосов.
Используете ОС Windows?