Linux послать нажатие клавиши

Как послать нажатие клавиши через командную строку?

Здравстсвуйте, добрый денёкъ, свободная минутка. Пишу вам письмо любезные линуксозаводчкики, и линкукоразводители. Давеча, поставилъ xbindkeys, посмотрелъ xev покормилъ nano

/.xbindkeysrc после чего заработалъ запускъ счёт по control+/ , чему я признаться весьма сильно радъ. Но почему то не заработало по правой клавише win и / . Отчего такъ?

И вотъ посему, родилась у меня идея, как бы по комбинации «rwin + п» посылись бы значитъ следующие буквы «Приветствую, доброго здоровьичка!» въ любое изъ запущенныхъ приложений, соответственно находящихся въ фокусе!

Какъ это сотворить?

боюсь предположить, но твой текст с твердым знаком после согласных, случайно не является следствием освоения xbindkeys?

Ответ на твой вопрос: xbindkeys + xvkbd.

Только через xcompose. Потому, что xvkbd, который посоветовал предыдущий оратор, не дружит с юникодом/кириллицей.

Ставилъ xvkbd что то не понялъ какъ имъ пользоваться. Я бы ещё хотел ять на клавишу либо сontrol+я либо просто rwin забить.

Мне больше нравиться неизвращённый большиками русский языкъ. Хотя к сожалению я его пока слабо знаю.

Вообще было бы очень хорошо, если бы можно было ещё ударение в словахъ ставить, ибо зАмок и замОк это разные вещи. Иногда происходитъ непонимание изъ за этого.

Советую. Но оно работает немного не так: compose-клавиша нажимается перед чем-то, как dead-key, а не как модификатор.

Можно поставить на compose- любой уникодный символ (включая ударение и ять, пример по ссылке), слово (например, УМВР), предложение (Съешь ещё этих мягких французских булок да выпей чаю) без лимита на количество комбинаций (я как-то делал

5000 комбинаций, реализуя wubizixing-ввод китайского и оно работало без заметных на глаз тормозов).

И да, если кому-нибудь не лень, запилите статью по xcompose в лоровики.

«rwin + п» посылись бы значитъ следующие буквы «Приветствую, доброго здоровьичка!»

Въ общемъ включилъ композицию, в Системныхъ параметрахъ гнома 3

по крайней мере композиция+o+r ® и композиция o+c © работаютъ. Однако же вот это

Источник

послать фоновому процессу нажатие клавиши q

Уважаемые! Подскажите, плиз, как можно послать фоновому процессу нажатие клавиши? Для корректного завершения программы надо ей посылать q (quit), просто убивать не совсем хорошо, она буффер из памяти не дописывает в файл.

Подробнее: Имеется скрипт save-grep: #!/bin/bash filename=»/`date +%y%m%d-%H%M%S`.txt» echo $filename > /lock echo «Write trace file $filename» echo «Press q to stop» /mnt/dom/dect/g1st -d | grep -e 0x3 -e ‘channel number’ -e \(Orig\) -e ALERTING \ -e SETUP -e RELEASE -e ‘I frame’ -e CONNECT -e DATE -e \(Dest\) -e PROCEEDING \ -e ’91\.85\.55 94:46′ >> $filename

Этот скрипт я запускаю из консоли в фон: /mnt/dom/dect/save-grep & Далее командой echo $! > /save-grep.pid записываю номер ее процесса в файл. Сессия по ssh с этим компьютером на этом завершается. По истечении суток в новой сессии надо корректно завершить этот процесс посылкой ему нажатия клавиши q. Как это можно сделать ?

Читайте также:  Не открывается брандмауэр windows 10 вам понадобится новое приложение

Re: послать фоновому процессу нажатие клавиши q

А если не извращаться с клавишами и фоновыми процессами, а написать правильно — перехватчик сигналов, который все правильно разруливает и прибивать программу обычным способом?

Re: послать фоновому процессу нажатие клавиши q

Программу, запускаемую скриптом, я изменить не могу, нет на нее ничего, кроме бинарника. Да и не программер я, так, погулять вышел :).

Re: Re: послать фоновому процессу нажатие клавиши q

Попробуй запустить свою g1st через конвейер: вместо
/mnt/dom/dect/g1st .

(path to binary)/qfake|mnt/dom/dect/g1st .

где qfake при приеме какого — нибудь сигнала (SIGHUP,
SIGUSR1 или SIGUSR1) будет посылать на дескриптор 1 строку «q\n»
и закругляться.

Re: послать фоновому процессу нажатие клавиши q

Т.е. qfake — внешний обработчик сигналов. Идею понял, спасибо.
Жаль, реализовать пока не смогу — знаний маловато :). Только шелл более-менее и знаю.

Re: Re: послать фоновому процессу нажатие клавиши q

alexey_p (*) (2003-09-19 18:35:12.551224):

> Жаль, реализовать пока не смогу — знаний маловато 🙂

Заглядывай сюда — на днях напишу. Сегодня — нет. Или мыло давай, пришлю код в районе понедельника.

Или — люди, на 20 мин. работы с отладкой — помогите!

Re: послать фоновому процессу нажатие клавиши q

> Заглядывай сюда — на днях напишу. Сегодня — нет. Или мыло давай, пришлю код в районе понедельника
Обязательно буду заглядывать :).
Мейл — nick pues.podolsk.ru
Спасибо, Die-Hard, буду ждать.

Re: послать фоновому процессу нажатие клавиши q

Может я чего не понял, но по-моему исходная постановка задачи некорректна.

Фоновые (background) процессы никогда не получают ввод со своего терминала, более того — попытка что-нибудь с него считать приведет либо к получению SIGTTIN либо EIO (для orphaned). Т.е. процесс ожидающий ввода не может нормально функционировать в фоновом режиме.

Re: послать фоновому процессу нажатие клавиши q

Сорри, я чайник. Сейчас перепроверил — действительно процесс Stopped (tty output). Теперь дошло, что его останавливают именно за input, а не за output — т.е. загнать в фон и отключить терминал действительно не получится.
Жаль — придется по-прежнему из под винды постоянно держать открытым терминал putty на эту машину и просто посылать этому окну nncron-ом нажатие q. А так хотелось убрать это на машину с линуксом и поручить крону — облом-с.
Обидно, что в винде это удалось достаточно несложно реализовать и оно работает. В линуксе без навыков программирования сделать то же самое — похоже, фигушки. Да и с ними в данном случае, видимо, вряд ли возможно. Машина, на которой я это запускаю, не совсем обычна. Это контроллер системы радиодоступа DECT, сделанный под линуксом, без винта, с флэш-диском 40 Мб. Убрано все, что можно, крона тоже нет. Имеющиеся программы без исходников — одни бинари, и их доработки ждать не приходится.
Я смог сделать запись нормального лога работы этого контроллера вышеописанным способом и еще кое-что здорово нужное для нормальной эксплуатации. Вот только если связь по локальной сети с этим компьютером прерывается, процесс остается и работает еще часа два, а в новом терминале после восстановления связи я уже пишу параллельно еще один лог с теми же записями — в общем, бардак. Да и при проведении обслуживания виндовой машины — дефрагментация диска — лог не пишется, я на ней все останавливаю на это время.
Если бы вышеописанное получилось, оно не зависело бы от связи по локалке и перезапускалось кроном с линуксовой машины. Жаль, не выйдет.

Читайте также:  Ворд для линукс минт

Источник

Эмуляция нажатия мультимедийных клавиш в Windows, Linux и Mac OS X

В перечислении Qt::Key для события QKeyEvent определены 15 типов клавиш управления мультимедиа (см. таблицу в конце статьи). Все они могут быть использованы в фильтре событий (installEventFilter) для обработки нажатия клавиш на мультимедийной клавиатуре (позволяющей управлять аудиоустройством и воспроизведением).
В статье рассмотрена обратная задача — отправка в систему команд управления мультимедиа путем эмуляции нажатия соответствующих клавиш в Windows, Linux и MacOSX (операционные системы упорядочены по времени, потраченному на поиск решения). Представленный в статье материал может быть отправной точкой к дальнейшему изучению вопроса кроссплатформенной отправки событий в цикл обработки системных сообщений.

Прежде чем перейти непосредственно к описанию исходного кода давайте рассмотрим, где вообще может применяться эмуляция мультимедийных клавиш, например:

  • создание виджетов управления воспроизведением аудио;
  • эмуляция пользовательского ввода при тестировании приложений;
  • создание приложения для удаленного управления аудиосистемой. В данном случае приложение на компьютере выступает в качестве сервера, а клиентом является смартфон. Такая связка позволит управлять аудио/видео не вставая с дивана или, например, автоматически ставить на паузу воспроизведение при поступлении входящего звонка;
  • создание приложения, «расшаривающего» клавиатуру и мышь на два и более компьютеров по сети (предварительно дополнив представленный код до полного набора клавиш);
  • создание систем «умный дом», новых человеко-машинных интерфейсов (управление голосовыми командами и др.).

Так как QEvent позволяет отправлять сообщение только конкретному объекту «внутри» приложения, то стандартными средствами Qt эмулировать нажатия клавиш не получится. Для этого будем использовать системные вызовы Api (в случае с Windows) или соответствующие библиотеки (X Window System в Linux и ряд фреймворков в Mac OS X).
Для удобства описания почти всю реализацию отправки сообщений разместим в функции sendKeyEventToSystem(Qt::Key qtKey), которой передается код клавиши из перечисления Qt::Key. Данная функция и будет вызываться из слотов, например:
Платформенно-зависимый код будем отделять директивами #ifdef OS_TYPE и #endif (еще часть кода на Objective-C вынесем в отдельный файл macx.mm, но об этом позже).

Эмуляция нажатия клавиатуры в Windows

В данной операционной системе за отправку сообщений отвечает функция SendInput. Она позволяет отправлять сообщения с кодами, полный перечень которых представлен на странице MSDN Virtual-Key Codes.
Для использования этой функции необходимо подключить заголовочный файл .

Примеров использования данной функции в интернете много и ее применение не должно вызвать проблем, поэтому сразу привожу код (в части Windows):
Здесь и далее в примерах будут использоваться всего 3 клавиши. В конце статьи приведена таблица соответствия кодов.

Эмуляция нажатия клавиатуры в Linux

Для эмуляции клавиш в Linux, на мой взгляд, проще всего использовать библиотеку разработчиков libXtst (X11 Record extension library).
Для ее получения из пакетов необходимо выполнить команду:Также будет необходимо подключить библиотеку в файле проекта:

В начале файла подключим необходимые заголовочные файлы и определим ряд констант, соответствующих кодам мультимедийных клавиш (дело в том, что в файле X11/keysymdef.h коды для мультимедийных клавиш отсутствуют).

Код эмуляции в части Linux:

Эмуляция нажатия клавиатуры в Mac OS X

Попытки найти решение для MacOS X не приносили плодов (скупые примеры были написаны на Objective-C), до тех пор, пока в гугле не натолкнулся на статью с хабра Интеграция приложений Qt в среду Mac OS X (с использованием Cocoa и Objective-C++). Мне уже ранее попадалась англоязычная статья, в которой описывалось, как изолировать код C++ для использования в Objective-C приложении. Мне же нужно было совершенно противоположное — изолировать Objective-C код (который выполнял нужные мне функции, но в то же время на который ругался компиллятор). Все оказалось достаточно просто:
1. создал файл macx.mm и разместил в нем Objective-С код (при этом в файле проекта автоматически появилась строка
2. создал файл macx.h и разместил в нем объявление функции из macx.mm (добавив #include «macx.h» в macx.mm).
3. в файле проекта добавил подключение необходимых фреймворков, в частности:

Читайте также:  Space rangers 2 linux

4. Внутри макроса условной компиляции для Mac OS X добавил необходимые хидеры и macx.h.
5. В уже знакомой вам switch-case структуре вставил вызовы новоиспеченной функции.

Таким образом в начале файла у нас появилась конструкция для Mac OS X:

В функцию sendKeyEventToSystem добавляется следующий код:

Cодержимое файла mac.mm:

Заключение:

Для меня было немного странно, что до сих пор не существует открыто доступной кроссплатформенной библиотеки, позволяющей выполнять отправку сообщений (в том числе события клавиатуры, мыши и д.р.). Во всяком случае мне такую библиотеку так и не получилось найти. Представленный код далек от совершенства (представляю, как разрастется switch-case последовательность при добавлении новых клавиш). Но тем не менее пусть это будет небольшой вклад в общую копилку базы знаний о написании кросплатформенных приложений.
В ходе работы над статьей было замечено, что VirtualBox перехватывает нажатия мультимедийных клавиш (проверялось на Ubuntu — c «железа» все работало). Данного недостатка лишена WMWare (проверялось на Mac OS X).

Приложение: Перечень мультимедийных клавиш и их определений (с помощью #define).

Источник

Перехват нажатия клавиши на Linux

Перехват нажатия клавиш XGrabKeyboard
Нашёл готовое решение, немного допилил и получился вот такой говнокод: #include .

Получение нажатия клавиши из неактивного окна
Привет всем! Как можно получить нажатую клавишу, если окно приложения не активно?

Скомпилированная программа закрывается после нажатия клавиши
В общем такая проблема, написал прогу на c++ , скомпилировал, у меня всё работает.

Отлов нажатия клавиатуры в Linux
Здравствуйте, может кто то подсказать как сделать глобальный отлов нажатия клавиш клавиатуры? В.

Такое можно сделать и в X11

А вот например в игре, когда человечек прыгает не вверх, а вперед, т.е. наприме если A — прыжок, B — бежать вперед, а когда нажимаешь вместе A и B — человечек прыгает вперед, а не вверх.

( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
cout 0

Объясните пожалуйста что и для чего тут делается.

Добавлено через 12 часов 49 минут
Объясните пожалуйста хоть что-нибудь.

погрызть или в тырнете поискать.

Добавлено через 4 минуты
если заинтересовался, тебе надо по библиотеке termios искать (заголовочный файл termios.h) — есть обстоятельное мануалище под названием:
Управление терминалами (curses/terminfo)

1/ ты сравниваешь char, а надо int
2/ для пользования курсорных и управляющих клавиш можно использовать макросы. Они описаны в ncurses.h
KEY_LEFT
KEY_RIGHT
KEY_UP
KEY_DOWN
коды их больше 255: 258, 259, 260

посмотри man getch
#include
для компиляции необходимо подключить -lncurses в gcc/g++
3/ примерчик на си:

Добавлено через 16 минут
для создания интерактивных консольных приложений тебе надо бы использовать ncurses.
termios необходимо для установления связи с терминалом и задания атрибутов ввода-вывода (в частности канон/неканон эхо/неэхо). При использовании ncurses можно обойтись используемыми в ней функциями.
Также если не хочется заморачиваться, и хочется покодить «по-быстрому», можно использовать команды баш:
system(«stty -icanon -echo»);
отключает канон и эхо
system(«stty icanon echo»);
соответственно включает

Источник

Оцените статью