- Как послать нажатие клавиши через командную строку?
- послать фоновому процессу нажатие клавиши q
- Re: послать фоновому процессу нажатие клавиши q
- Re: послать фоновому процессу нажатие клавиши q
- Re: Re: послать фоновому процессу нажатие клавиши q
- Re: послать фоновому процессу нажатие клавиши q
- Re: Re: послать фоновому процессу нажатие клавиши q
- Re: послать фоновому процессу нажатие клавиши q
- Re: послать фоновому процессу нажатие клавиши q
- Re: послать фоновому процессу нажатие клавиши q
- Эмуляция нажатия мультимедийных клавиш в Windows, Linux и Mac OS X
- Эмуляция нажатия клавиатуры в Windows
- Эмуляция нажатия клавиатуры в Linux
- Эмуляция нажатия клавиатуры в Mac OS X
- Перехват нажатия клавиши на 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. Как это можно сделать ?
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. в файле проекта добавил подключение необходимых фреймворков, в частности:
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»);
соответственно включает
Источник