- Command to simulate keyboard input
- 2 Answers 2
- You must log in to answer this question.
- Linked
- Related
- Hot Network Questions
- Subscribe to RSS
- xvkbd — эмулятор клавиатуры в Ubuntu Linux
- Установка
- Использование
- xdotool — эмулятор действий мыши и клавиатуры
- Примеры использования
- Simulate keystroke in Linux with Python
- 6 Answers 6
- Эмуляция нажатия мультимедийных клавиш в Windows, Linux и Mac OS X
- Эмуляция нажатия клавиатуры в Windows
- Эмуляция нажатия клавиатуры в Linux
- Эмуляция нажатия клавиатуры в Mac OS X
Command to simulate keyboard input
Is there a command that exists that can simulate keypresses? I want to pipe some data to it to make it type into a GUI program for me.
2 Answers 2
To simulate a key press, use:
For example, to simulate pressing F2 :
To simulate pressing crtl + c :
To simulate pressing ctrl + c and then a Backspace :
xdotool key ctrl+c BackSpace
Check man xdotool to get more idea.
You might need to install the xdotool package first to use xdotool command.
What :key syntax is it to enter UP arrow key? Found it here as xdotool key Up askubuntu.com/q/382005/22308
#!/usr/bin/expect #set timeout 10 set clientName [lindex $argv 0]; set hostName [lindex $argv 1]; set passWord [lindex $argv 2]; spawn ssh "$hostName"; expect "Password:"; send "$passWord\r"; expect "$hostName"; send "cd /apps/bin\r"; expect " bin]";
You must log in to answer this question.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.7.14.43533
Linux is a registered trademark of Linus Torvalds. UNIX is a registered trademark of The Open Group.
This site is not affiliated with Linus Torvalds or The Open Group in any way.
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
xvkbd — эмулятор клавиатуры в Ubuntu Linux
Утилита xvkbd используется для эмуляции нажатия клавиш и клавиатурных сочетаний. Утилита не доступна из PPA репозитория, поэтому вам придется компилировать исходники, а также, скорее всего, потребуется установка дополнительных пакетов. Если вы не привязаны именно к этой тулзе — я бы порекомендовал использовать более функциональный аналог xdotool .
Примечание
Версия 3.0 не умела эмулировать нажатие одиночных мета-клавиш — Meta , Control , Alt , а только в паре с символом. Написав об этом разработчику (T.Sato, VEF00200[собака]nifty.ne.jp), он удивительно быстро отреагировал и выложил новую версию.
Установка
Качаем нужную версию (в данный момент xvkbd 3.3) тут и распаковываем архив в любой каталог, после чего переходим в консоли в этот каталог. Для компиляции нам понадобится утилита xmkmf , устанавливаем:
xmkmf; make install install.man
Для отладки запускайте утилиту xvkbd с опцией -debug .
Внимание!
Ошибка xvkbd.c:35:25: фатальная ошибка: X11/Xaw/Box.h: Нет такого файла или каталога компиляция прервана при установке на Kubuntu 11.10 лечится установкой следующих пакетов:
apt-get install libxaw7-dev xaw3dg-dev libxtst-dev
Использование
xvkbd -xsendevent -text '\[Control_L]a'
Не используйте опцию xsendevent для эмуляции одиночных клавиш-модификаторов!
xdotool — эмулятор действий мыши и клавиатуры
Утилита предоставляет широкие возможности по управлению клавиатурой и мышью. Позволяет эмулировать нажатие клавиш и двигать курсор мыши. Некоторые примеры пригодятся при написании bash скриптов или для динамической подвязки горячих клавиш. Также вы можете заранее определить текст, который нужно ввести в определенное поле при определенных условиях.
* Xdotool умеет переключать клавиши с индикаторами *lock однако сами световые индикаторы не изменяют свое состояние.
Есть другие утилиты для эмуляции нажатия клавиш xvkbd, xte (менее функциональная) и для работы с буфером обмена — xsel, xclip.
Примечание
Определить keycode и keysym клавиши, а также дополнительную информацию о клавише, можно утилитами xev или xkeycaps.
Также можно получить комбинацию клавиш утилитой xbindkeys:
Примеры использования
Эмулировать нажатие клавиш по названию:
xdotool key Shift+Left xdotool key Control+c xdotool key Alt+Tab xdotool key Shift+Caps_Lock xdotool key XF86AudioRaiseVolume xdotool key XF86AudioLowerVolume xdotool keyup Mod2+Mod4+m ## Отпустить клавиши xdotool key Ctrl+Alt+Shift+m
Триггер нажатия клавиши по keycode или keysym :
xdotool key 0xfe08 # keysym клавиши Meta Right xdotool key 134 # keycode клавиши Meta Right xdotool key 105+62 # keycode клавиш Control_R и Shift_R
Эмулируем отпускание клавиши KP_End и нажатие комбинации Shift+Home:
xdotool keyup KP_End key Shift+Home
Эмулируем вставку из буфера (можно поиграться со значением delay):
xdotool key --clearmodifiers --delay 20 ctrl+shift+v
Определить позицию курсора:
xdotool getmouselocation xdotool getmouselocation -shell
X=224 Y=45 SCREEN=0 WINDOW=56623111
xdotool click --repeat 3 1 ## Triple Click (Select line) xdotool click 2 ## Middle click xdotool click 3 ## Right Click (Menu) xdotool click 4 ## Scroll wheel up xdotool click 5 ## Scroll wheel down xdotool mousedown 1 xdotool mousemove 100 100 click 3 xdotool mousedown 1 sleep 0.1 mouseup 1
xdotool type --delay 0 --clearmodifiers "$(xsel -b -o)" ## Вывести/напечатать текст из clipboard
Примечание
Есть более простой способ эмуляции ввода текста (требует рута):
#keys #keyboard #keycode #xdotool #emulation #hotkeys #bind keys
Сообщения
# file /dev/keyboard /dev/keyboard: cannot open `/dev/keyboard’ (No such file or directory) февраля 2021
Simulate keystroke in Linux with Python
How can I simulate a keystroke in python? I also want to press multiple keys simultaneously. Something like:
6 Answers 6
Consider python-uinput and evdev. Example of shift+a with the latter:
from evdev import uinput, ecodes as e with uinput.UInput() as ui: ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 1) ui.write(e.EV_KEY, e.KEY_A, 1) ui.syn()
I tried similar code, it is exeuted because I see in system log that a new virtual input device was created but the keystrokes do not appear in X? Any special thing can be done so the keys are received by X server?
This is great! Note that 1 is a keydown event and 0 is keyup, so if you wanted to simulate a pressing and releasing a key more than once, you would need to place something like the following lines in a loop: ui.write(ecodes.EV_KEY, ecodes.KEY_DOWN, 1) #key down ui.write(ecodes.EV_KEY, ecodes.KEY_DOWN, 0) #key up ui.syn()
Adding KERNEL==»uinput», MODE=»0666 to the top of /etc/udev/rules.d/50-rogdrv.rules and reloading rules solves the problem» (github issue) You can reload udev rules like this # udevadm control —reload-rules && udevadm trigger (source)
Although it’s specific to X, you can install the xautomation package ( apt-get install xautomation on Debian-based systems) and use xte to simulate keypresses, e.g.:
from subprocess import Popen, PIPE control_f4_sequence = '''keydown Control_L key F4 keyup Control_L ''' shift_a_sequence = '''keydown Shift_L key A keyup Shift_L ''' def keypress(sequence): p = Popen(['xte'], stdin=PIPE) p.communicate(input=sequence) keypress(shift_a_sequence) keypress(control_f4_sequence)
Эмуляция нажатия мультимедийных клавиш в Windows, Linux и Mac OS X
Платформенно-зависимый код будем отделять директивами #ifdef OS_TYPE и #endif (еще часть кода на Objective-C вынесем в отдельный файл macx.mm, но об этом позже).
Эмуляция нажатия клавиатуры в Windows
В данной операционной системе за отправку сообщений отвечает функция SendInput. Она позволяет отправлять сообщения с кодами, полный перечень которых представлен на странице MSDN Virtual-Key Codes.
Для использования этой функции необходимо подключить заголовочный файл .
#ifdef Q_OS_WIN32 #define WINVER 0x0500 #include #endif
Примеров использования данной функции в интернете много и ее применение не должно вызвать проблем, поэтому сразу привожу код (в части Windows):
sendKeyEventToSystem(Qt::Key qtKey) < //функция эмуляции нажатия клавиши. qtKey - тип клавиши #ifdef Q_OS_WIN32 INPUT ip; //устройство ввода ip.type = INPUT_KEYBOARD; ip.ki.wScan = 0; ip.ki.time = 0; ip.ki.dwExtraInfo = 0; //в зависимости от типа клавиши switch (qtKey) < case Qt::Key_MediaPrevious: ip.ki.wVk = VK_MEDIA_PREV_TRACK; //предыдущий трек break; case Qt::Key_MediaTogglePlayPause: ip.ki.wVk = VK_MEDIA_PLAY_PAUSE; //для переключения режима воспроизведения break; case Qt::Key_MediaNext: ip.ki.wVk = VK_MEDIA_NEXT_TRACK; //следующий трек break; default: return; break; >//посылаем событие нажатия клавиши ip.ki.dwFlags = 0; SendInput(1, &ip, sizeof(INPUT)); //а затем отжатия клавиши ip.ki.dwFlags = KEYEVENTF_KEYUP; SendInput(1, &ip, sizeof(INPUT)); #endif >
Здесь и далее в примерах будут использоваться всего 3 клавиши. В конце статьи приведена таблица соответствия кодов.
Эмуляция нажатия клавиатуры в Linux
Для эмуляции клавиш в Linux, на мой взгляд, проще всего использовать библиотеку разработчиков libXtst (X11 Record extension library).
Для ее получения из пакетов необходимо выполнить команду:
sudo apt-get install libxtst-dev
В начале файла подключим необходимые заголовочные файлы и определим ряд констант, соответствующих кодам мультимедийных клавиш (дело в том, что в файле X11/keysymdef.h коды для мультимедийных клавиш отсутствуют).
#ifdef Q_OS_LINUX #include #include #define XF86AudioLowerVolume 0x1008ff11 #define XF86AudioMute 0x1008ff12 #define XF86AudioRaiseVolume 0x1008ff13 #define XF86AudioPlay 0x1008ff14 #define XF86AudioStop 0x1008ff15 #define XF86AudioPrev 0x1008ff16 #define XF86AudioNext 0x1008ff17 #define XF86AudioPause 0x1008ff31 #endif
#ifdef Q_OS_LINUX unsigned int key; unsigned int keycode; switch (qtKey) < case Qt::Key_MediaPrevious: key = XF86AudioPrev; break; case Qt::Key_MediaTogglePlayPause: key = XF86AudioPlay; break; case Qt::Key_MediaNext: key = XF86AudioNext; break; default: return; break; >// подключаемся к X Display *display; display = XOpenDisplay(NULL); // получаем код клавиши keycode = XKeysymToKeycode(display, key); // эмулируем нажатие клавиши XTestFakeKeyEvent(display, keycode, 1, 0); // эмулируем отжатие клавиши XTestFakeKeyEvent(display, keycode, 0, 0); // очищаем буфер X XFlush(display); // отключаемся от X XCloseDisplay(display); #endif
Эмуляция нажатия клавиатуры в Mac OS X
Попытки найти решение для MacOS X не приносили плодов (скупые примеры были написаны на Objective-C), до тех пор, пока в гугле не натолкнулся на статью с хабра Интеграция приложений Qt в среду Mac OS X (с использованием Cocoa и Objective-C++). Мне уже ранее попадалась англоязычная статья, в которой описывалось, как изолировать код C++ для использования в Objective-C приложении. Мне же нужно было совершенно противоположное — изолировать Objective-C код (который выполнял нужные мне функции, но в то же время на который ругался компиллятор). Все оказалось достаточно просто:
1. создал файл macx.mm и разместил в нем Objective-С код (при этом в файле проекта автоматически появилась строка
OBJECTIVE_SOURCES += macx.mm
2. создал файл macx.h и разместил в нем объявление функции из macx.mm (добавив #include «macx.h» в macx.mm).
3. в файле проекта добавил подключение необходимых фреймворков, в частности:
macx:LIBS += -framework ApplicationServices -framework IOKit
4. Внутри макроса условной компиляции для Mac OS X добавил необходимые хидеры и macx.h.
5. В уже знакомой вам switch-case структуре вставил вызовы новоиспеченной функции.
Таким образом в начале файла у нас появилась конструкция для Mac OS X:
#ifdef Q_OS_MAC #include //оставил для типа UInt8 #include //коды клавиш #include "mac.h" //определение функции для вызова Objective-C кода #endif
#ifdef Q_OS_MAC switch (qtKey) < case Qt::Key_MediaPrevious: HIDPostAuxKey( NX_KEYTYPE_PREVIOUS ); break; case Qt::Key_MediaTogglePlayPause: HIDPostAuxKey( NX_KEYTYPE_PLAY ); break; case Qt::Key_MediaNext: HIDPostAuxKey( NX_KEYTYPE_NEXT ); break; default: return; break; >#endif
#import #import #import #include "macx.h" static io_connect_t get_event_driver(void) < static mach_port_t sEventDrvrRef = 0; mach_port_t masterPort, service, iter; kern_return_t kr; if (!sEventDrvrRef) < // Get master device port kr = IOMasterPort( bootstrap_port, &masterPort ); check( KERN_SUCCESS == kr); kr = IOServiceGetMatchingServices( masterPort, IOServiceMatching( kIOHIDSystemClass ), &iter ); check( KERN_SUCCESS == kr); service = IOIteratorNext( iter ); check( service ); kr = IOServiceOpen( service, mach_task_self(), kIOHIDParamConnectType, &sEventDrvrRef ); check( KERN_SUCCESS == kr ); IOObjectRelease( service ); IOObjectRelease( iter ); >return sEventDrvrRef; > void HIDPostAuxKey(const UInt8 auxKeyCode ) < NXEventData event; kern_return_t kr; IOGPoint loc = < 0, 0 >; // Сообщение о нажатии клавиши UInt32 evtInfo = auxKeyCodeЗаключение:
Для меня было немного странно, что до сих пор не существует открыто доступной кроссплатформенной библиотеки, позволяющей выполнять отправку сообщений (в том числе события клавиатуры, мыши и д.р.). Во всяком случае мне такую библиотеку так и не получилось найти. Представленный код далек от совершенства (представляю, как разрастется switch-case последовательность при добавлении новых клавиш). Но тем не менее пусть это будет небольшой вклад в общую копилку базы знаний о написании кросплатформенных приложений.
В ходе работы над статьей было замечено, что VirtualBox перехватывает нажатия мультимедийных клавиш (проверялось на Ubuntu — c «железа» все работало). Данного недостатка лишена WMWare (проверялось на Mac OS X).Приложение: Перечень мультимедийных клавиш и их определений (с помощью #define).
Qt::Key | Windows | Linux | Mac OS X |
---|---|---|---|
Qt::Key_VolumeDown | VK_VOLUME_DOWN | XF86AudioLowerVolume | NX_KEYTYPE_SOUND_DOWN |
Qt::Key_VolumeMute | VK_VOLUME_MUTE | XF86AudioMute | NX_KEYTYPE_MUTE |
Qt::Key_VolumeUp | VK_VOLUME_UP | XF86AudioRaiseVolume | NX_KEYTYPE_SOUND_UP |
Qt::Key_BassBoost | |||
Qt::Key_BassUp | |||
Qt::Key_BassDown | |||
Qt::Key_TrebleUp | |||
Qt::Key_TrebleDown | |||
Qt::Key_MediaPlay | VK_MEDIA_PLAY_PAUSE | XF86AudioPlay | NX_KEYTYPE_PLAY |
Qt::Key_MediaStop | VK_MEDIA_STOP | XF86AudioStop | |
Qt::Key_MediaPrevious | VK_MEDIA_PREV_TRACK | XF86AudioPrev | NX_KEYTYPE_PREVIOUS |
Qt::Key_MediaNext | VK_MEDIA_NEXT_TRACK | XF86AudioNext | NX_KEYTYPE_NEXT |
Qt::Key_MediaRecord | |||
Qt::Key_MediaPause | XF86AudioPause | ||
Qt::Key_MediaTogglePlayPause | VK_MEDIA_PLAY_PAUSE | XF86AudioPlay | NX_KEYTYPE_PLAY |
Ссылки по теме:
1. Существующие подходы к решению проблемы: C++ (Qt) cross-platform library for simulating keyboard input, sendkeys, send kestrokes, etc
2. Описание функции SendInput и перечень кодов клавиатуры на сайте MSDN.
3. Simulating Mediakey Presses in C & X11 — в статье описывается, как в Linux с помощью утилиты «xev» (в Ubuntu: «sudo apt-get install x11-utils») можно узнать коды клавиш, а также в дополнение статья с archlinux.org.
4. Эмуляция мультимедийных клавиш в MacOS X на языке программирования Python.