Имитация нажатия клавиш linux

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

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 для эмуляции одиночных клавиш-модификаторов!

Читайте также:  Find linux поиск папки

Источник

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) 

Источник

Читайте также:  Synology surveillance station client linux

Эмуляция нажатия мультимедийных клавиш в 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 структуре вставил вызовы новоиспеченной функции.

Читайте также:  Linux shell script which

Таким образом в начале файла у нас появилась конструкция для 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.

Источник

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