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