Russian Qt Forum

Qt => Общие вопросы => Тема начата: alexorleon от Июнь 16, 2016, 09:10



Название: [РЕШЕНО] Имитация ctrl+v в системе
Отправлено: alexorleon от Июнь 16, 2016, 09:10
День добрый.

Подскажите, как программно вызвать комбинацию клавиш "ctrl+v"?
В трее крутится программа и читает com порт. При возникновении события, она копирует сообщение в буфер:

Код:
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText("BLA_BLA_BLA");

Теперь надо вставить этот текст где стоит курсор. Это может быть и открытый блокнот и адресная строка браузера и т.д.
Или может есть другие решения? Все, что находил, работает непосредственно внутри самой программы.


Название: Re: Имитация ctrl+v в системе
Отправлено: Bepec от Июнь 16, 2016, 11:48
Платформозависимо вызвать Ctrl + V. При этом снимая фокус с окна программы своей если он есть :)


Название: Re: Имитация ctrl+v в системе
Отправлено: alexorleon от Июнь 16, 2016, 12:01
Платформозависимо вызвать Ctrl + V. При этом снимая фокус с окна программы своей если он есть :)
Вот уже пол дня пытаюсь нагуглить. Но попадается противоположное решение (регистрация клавиш, т.е. реагирование программы на пользовательский ввод)  :)


Название: Re: Имитация ctrl+v в системе
Отправлено: Igors от Июнь 16, 2016, 12:13
Теперь надо вставить этот текст где стоит курсор. Это может быть и открытый блокнот и адресная строка браузера и т.д.
Или может есть другие решения?
Нативными средствами - почему нет? WinAPI - см GetFocus и SendMessage. На OSX хужее - придется рыться в AppleTalk. Это достижимо, но толку - послать "кому-то", кто неизвестно что сделает. Смысл?


Название: Re: Имитация ctrl+v в системе
Отправлено: alexorleon от Июнь 16, 2016, 12:33
У меня возникли сложности с АПИ под линукс. Толком ничего не нашел. Но для себя нашел вот такое решение.

Ставим Xdotool.
http://xmodulo.com/simulate-key-press-mouse-movement-linux.html

Код:
QClipboard *clipboard = QApplication::clipboard();
clipboard->setText("BLA_BLA_BLA");

QByteArray key("xdotool key Ctrl+V");
QProcess command;
command.start(key);
command.waitForFinished(3000);

Есть исходники, можно будет покопаться, поизучать.

Под убунтой точно работает. Всем спасибо за помощь!