Russian Qt Forum

Qt => Общие вопросы => Тема начата: Aleksey_Zh от Октябрь 05, 2009, 15:09



Название: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 05, 2009, 15:09
Как в Qt сделать программную эмуляцию нажатия клавиатуры? Подскажите кто - нибудь, а то всю голову сломал! ???


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: pastor от Октябрь 05, 2009, 15:35
QKeyEvent + QApplication::postEvent спасет отца русской демократии ))


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 05, 2009, 15:42
QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
        Qt::Key_A,Qt::NoModifier, "A");

пробовал и QApplication::sendEvent(NULL, pe) ;

пробовал и QApplication::postEvent(NULL,pe);

не пашет ((


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: BaltikS от Октябрь 05, 2009, 15:46
А Вы как хотите проэмулировать нажатие?
В другую программу? То этот вариант не годится.


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 05, 2009, 15:49
Как раз во внешнюю программу и нужно передать. Я такую штуку на дельфе раньше делал, там это достигалось путем отправки сообщений. А тут я пока новичок. Еще не очень разобрался...


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: pastor от Октябрь 05, 2009, 15:50
не пашет ((

Вместо NULL нужно указать конкретного получателя.

Опиши подробнее задачу, что тебе нужно сделать?


//upd

не заметил последний пост.

> Как раз во внешнюю программу и нужно передать.

В таком случает предложенный вариант работать не будет. Нужно искать платформозависимое решение. Для винды смотри в сторону keybd_event или SendInput:

Цитировать
The keybd_event function synthesizes a keystroke. The system can use such a synthesized keystroke to generate a WM_KEYUP or WM_KEYDOWN message. The keyboard driver's interrupt handler calls the keybd_event function.

Цитировать
The SendInput function synthesizes keystrokes, mouse motions, and button clicks.



Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 05, 2009, 15:52
Конкретным получателем будет форма на сайте с весьма вредной структурой. Копирование из буфера обмена не получится, уже пробовал. Так что нужно делать эмуляцию вбивания данных.


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: viktor.kz от Октябрь 06, 2009, 09:56
А если загрузить сайт в QWebView и там сделать:
webView->page()->mainFrame()->evaluateJavaScript(QString("document.forms[0].username.value = '%1';").arg(value));


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 06, 2009, 10:24
По большому счету можно и так, но это утяжелит программу... и к тому же хотелось бы все таки решить данную проблему именно с клавиатурой


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Igors от Октябрь 06, 2009, 10:31
По большому счету можно и так, но это утяжелит программу... и к тому же хотелось бы все таки решить данную проблему именно с клавиатурой
Конечно, дело Ваше как решать. Но "эмуляция клавиатуры" выглядит как самый тяжелый, платформо-зависимый и ненадежный путь. Прошли времена MS-Dos садиться на прерывания :)


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 06, 2009, 10:40
Я целиком и полностью согласен и с Вами и с viktor.kz просто если использовать предложенное выше решение - возникнет другая проблема. Необходимо каким - то образом позиционировать ввод данных. Ведь на странице куча прочей инфы, которую нужно пропустить, прежде чем вводить данные... А так - установил курсор в нужную ячейку, нажал хоткей и заполнение пошло.


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 06, 2009, 11:02
Спасибо pastor!!!

keybd_event(Qt::Key_A, MapVirtualKeyA(Qt::Key_A, 0),0,0);

такая конструкция успешно работает!!! Жаль, что только под виндой ))


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Question от Октябрь 06, 2009, 12:48
Алексей, а скажите пожалуйста какая нужна библиотека и какой заголовочный файл, чтобы keybd_event работала? у меня подозрение, что не хватает какой то библиотеки
если пишу #include <WinUser.h> он находит кучу ошибок в нем  ???
и следующий вопрос - есть ли keybd_event для windows mobile? на самом деле, нужно сделать эмуляцию нажатия стилусом, и не знаю как  :-\


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Aleksey_Zh от Октябрь 06, 2009, 14:35
для keybd_event требуется библиотека windows.h, хотя мне больше понравилась qt_windows.h, там набор функций вроде как побольше...
Насчет windows mobile к сожалению помочь пока ничем не смогу...


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Edynchik от Март 11, 2011, 16:15
QKeyEvent + QApplication::postEvent спасет отца русской демократии ))
А можно накидать небольшой примерчик....дело в том,что я хочу вводить пароль,когда выполняю команду sudo...


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: GreatSnake от Март 11, 2011, 17:27
Для sudo обычно пользуются псевдо-терминалами.


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Edynchik от Март 11, 2011, 17:33
Для sudo обычно пользуются псевдо-терминалами.
что значит псевдо-терминал? и как им пользоваться для введения пароля при использовании sudo?


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: GreatSnake от Март 11, 2011, 17:42
Цитировать
что значит псевдо-терминал?
http://en.wikipedia.org/wiki/Pseudo_terminal
Цитировать
как им пользоваться для введения пароля при использовании sudo?
http://www.prog.org.ru/topic_16702_0.html


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Edynchik от Март 11, 2011, 18:10
Цитировать
что значит псевдо-терминал?
http://en.wikipedia.org/wiki/Pseudo_terminal
Цитировать
как им пользоваться для введения пароля при использовании sudo?
http://www.prog.org.ru/topic_16702_0.html
прочитал ту тему, там указан источник...http://drdobbs.com/184403468?pgno=3 (http://drdobbs.com/184403468?pgno=3)...засунул исходник в Qt Creator, не скомлировался...а примеров больше по ссылке нет...У Вас есть скомпилированная версия исходников?


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: GreatSnake от Март 11, 2011, 18:18
Цитировать
прочитал ту тему, там указан источник...http://drdobbs.com/184403468?pgno=3...засунул исходник в Qt Creator, не скомлировался...а примеров больше по ссылке нет...
Ну да, здесь простым copy-paste не обойтись. Нужно малость и серое вещество поднапрячь однако.


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Edynchik от Март 11, 2011, 18:20
Цитировать
прочитал ту тему, там указан источник...http://drdobbs.com/184403468?pgno=3...засунул исходник в Qt Creator, не скомлировался...а примеров больше по ссылке нет...
Ну да, здесь простым copy-paste не обойтись. Нужно малость и серое вещество поднапрячь однако.
не в том дело что не хочется, просто не очень представляю что должно получиться в итоге...
Можно пояснить что выполняется в блоках try catch?


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Edynchik от Март 18, 2011, 13:53
4GreatSnake:
подскажите,не издевайтесь,толковый пример по использованию псевдо терминала...


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: GreatSnake от Март 18, 2011, 14:05
4GreatSnake:
подскажите,не издевайтесь,толковый пример по использованию псевдо терминала...
Я сильно извиняюсь, т.к. приведённые мной примеры сильно устарели и не работают  :(
Вот здесь (http://www.linux.org.ru/forum/development/2947563) по-свежее.


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: Edynchik от Март 18, 2011, 16:18
а куда собственно свою команду вставлять,которую надо запустить в псевдотерминале???


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: GreatSnake от Март 18, 2011, 16:21
См. http://www.linux.org.ru/forum/development/2947563#comment-2949698 execl()

На самом деле проблема псевдо-терминала никоим образом не имеет отношения к этой теме :(


Название: Re: Как в Qt сделать программную эмуляцию нажатия клавиатуры?
Отправлено: serg_hd от Март 18, 2011, 23:16
Я целиком и полностью согласен и с Вами и с viktor.kz просто если использовать предложенное выше решение - возникнет другая проблема. Необходимо каким - то образом позиционировать ввод данных. Ведь на странице куча прочей инфы, которую нужно пропустить, прежде чем вводить данные... А так - установил курсор в нужную ячейку, нажал хоткей и заполнение пошло.

Тебе же пример специально привели:

А если загрузить сайт в QWebView и там сделать:
webView->page()->mainFrame()->evaluateJavaScript(QString("document.forms[0].username.value = '%1';").arg(value));
Какое тут на&%"% позиционирование?) Единственное что надо было бы от сайта - наличие элемента (<input name="username" type="text"> к примеру, или любой другой который надо заполнить), т.е. он однозначно есть. А способов добраться до него со стороны яваскрипта много (по имени, по id если он есть, по коллекции элементов, по DOM, etc...) и это не проблема. Тут тебе и кроссовость и меньший груз проца. Однозначно, имея этот вариант, пытаться реализовывать его через эмуляцию нажатия клавишь, имхо, полный изврат.