LINUX.ORG.RU

с++ linux - простой способ эмулировать нажатие клавиш?

 , ,


0

1

есть сорцы софта

https://github.com/pjsip/pjproject/blob/master/pjsip-apps/src/pjsua/pjsua_app.c

в котором простой код

«Press %s to »

как мне програмного «нажимать кнопки?»

нашёл вот такой ужасный пример, но он не работает

пробовал через xdtool - не работает

через XTestFakeKeyEvent тоже не работает

как заставить его работать?

★★★★★

пробовал через xdtool - не работает

Ты про xdotool? А как ты пробовал? У меня он прекрасно работал всегда, я им дофига чего накрафтил в онлайн-игрушке одной браузерной. Правда, это было в довайладновые времена.

Zhbert ★★★★★
()

У тебя же есть исходники, возьми да исправь их чтобы не требовал никаких нажатий. А вообще там как минимум в одном месте этот лог внутри if (app_config.auto_answer < 200) { что как-бы намекает что его можно настроить на автоматический приём звонков.

slovazap ★★★★★
()
Ответ на: комментарий от smilessss

pexpect - для стандартного ввода вывода

pyatogui - для винды и иксов (вэйланд и остальное не уметь)

ydotool - в треккере pyatogui, пишут, что как-то но уметь в остальное

faq2
()

Оффтопик: понадобилось поработать с иксовым буфером обмена. Поскольку ламерство головного мозга, а дергать xdotool как-то неудобно (тыжпрограммист!), решил посмотреть, как это делается в вездесущем пхытоне. Гуглю — везде советуют pyperclip. Лезу в его код. А там — ТАДАМ — дергают xdotool. Семен Семеныч… Ищу альтернативу pyperclip, нахожу какой-то модуль clipboard. Ну, вот оно. А там примерно так:

from pyperclip import copy, paste

с обескураживающим признанием автора в комментарии, что когда он решил делать такой модуль, то выяснил, что вся функциональность уже есть в Pyperclip.

Как-то так 🤭.

Остается только смотреть, что можно взять из исходников xdotool, благо нужно для себя, и лицензия не помеха. Вот бы еще Си выучить для этого 😕.

Virtuos86 ★★★★★
()
Последнее исправление: Virtuos86 (всего исправлений: 1)

Здесь нужен uinput. Покажу основные строки, остальное в man’ах:

...........................
#include <linux/input.h>
#include <linux/uinput.h>
..........................
fd = ::open(dev_path, O_RDWR | O_NDELAY);
if (fd < 0) {
.......................................
if(ioctl(fd, EVIOCGRAB, 1) < 0) {
.......................................
void emit_event(int fd,uint16_t type, uint16_t code, int32_t val)
{
  struct input_event ev;
  memset(&ev, 0, sizeof(struct input_event));
  gettimeofday(&ev.time, NULL);
  ev.type = type;
  ev.code = code;
  ev.value = val;
  write(fd, &ev, sizeof(struct input_event));
........................................
emit_event(fd, EV_KEY, KEY_NUMLOCK, 1)
emit_event(fd, EV_SYN, SYN_REPORT, 0)
emit_event(fd, EV_KEY, KEY_NUMLOCK, 0)
emit_event(fd, EV_SYN, SYN_REPORT, 0)
anonymous
()