Russian Qt Forum
Май 22, 2024, 18:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Как в Qt сделать программную эмуляцию нажатия клавиатуры?  (Прочитано 22685 раз)
Aleksey_Zh
Гость
« : Октябрь 05, 2009, 15:09 »

Как в Qt сделать программную эмуляцию нажатия клавиатуры? Подскажите кто - нибудь, а то всю голову сломал! Непонимающий
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Октябрь 05, 2009, 15:35 »

QKeyEvent + QApplication::postEvent спасет отца русской демократии ))
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Aleksey_Zh
Гость
« Ответ #2 : Октябрь 05, 2009, 15:42 »

QKeyEvent* pe = new QKeyEvent(QEvent::KeyPress,
        Qt::Key_A,Qt::NoModifier, "A");

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

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

не пашет ((
Записан
BaltikS
Гость
« Ответ #3 : Октябрь 05, 2009, 15:46 »

А Вы как хотите проэмулировать нажатие?
В другую программу? То этот вариант не годится.
Записан
Aleksey_Zh
Гость
« Ответ #4 : Октябрь 05, 2009, 15:49 »

Как раз во внешнюю программу и нужно передать. Я такую штуку на дельфе раньше делал, там это достигалось путем отправки сообщений. А тут я пока новичок. Еще не очень разобрался...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #5 : Октябрь 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.

« Последнее редактирование: Октябрь 05, 2009, 15:56 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Aleksey_Zh
Гость
« Ответ #6 : Октябрь 05, 2009, 15:52 »

Конкретным получателем будет форма на сайте с весьма вредной структурой. Копирование из буфера обмена не получится, уже пробовал. Так что нужно делать эмуляцию вбивания данных.
Записан
viktor.kz
Гость
« Ответ #7 : Октябрь 06, 2009, 09:56 »

А если загрузить сайт в QWebView и там сделать:
webView->page()->mainFrame()->evaluateJavaScript(QString("document.forms[0].username.value = '%1';").arg(value));
Записан
Aleksey_Zh
Гость
« Ответ #8 : Октябрь 06, 2009, 10:24 »

По большому счету можно и так, но это утяжелит программу... и к тому же хотелось бы все таки решить данную проблему именно с клавиатурой
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Октябрь 06, 2009, 10:31 »

По большому счету можно и так, но это утяжелит программу... и к тому же хотелось бы все таки решить данную проблему именно с клавиатурой
Конечно, дело Ваше как решать. Но "эмуляция клавиатуры" выглядит как самый тяжелый, платформо-зависимый и ненадежный путь. Прошли времена MS-Dos садиться на прерывания Улыбающийся
Записан
Aleksey_Zh
Гость
« Ответ #10 : Октябрь 06, 2009, 10:40 »

Я целиком и полностью согласен и с Вами и с viktor.kz просто если использовать предложенное выше решение - возникнет другая проблема. Необходимо каким - то образом позиционировать ввод данных. Ведь на странице куча прочей инфы, которую нужно пропустить, прежде чем вводить данные... А так - установил курсор в нужную ячейку, нажал хоткей и заполнение пошло.
Записан
Aleksey_Zh
Гость
« Ответ #11 : Октябрь 06, 2009, 11:02 »

Спасибо pastor!!!

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

такая конструкция успешно работает!!! Жаль, что только под виндой ))
Записан
Question
Гость
« Ответ #12 : Октябрь 06, 2009, 12:48 »

Алексей, а скажите пожалуйста какая нужна библиотека и какой заголовочный файл, чтобы keybd_event работала? у меня подозрение, что не хватает какой то библиотеки
если пишу #include <WinUser.h> он находит кучу ошибок в нем  Непонимающий
и следующий вопрос - есть ли keybd_event для windows mobile? на самом деле, нужно сделать эмуляцию нажатия стилусом, и не знаю как  В замешательстве
Записан
Aleksey_Zh
Гость
« Ответ #13 : Октябрь 06, 2009, 14:35 »

для keybd_event требуется библиотека windows.h, хотя мне больше понравилась qt_windows.h, там набор функций вроде как побольше...
Насчет windows mobile к сожалению помочь пока ничем не смогу...
Записан
Edynchik
Гость
« Ответ #14 : Март 11, 2011, 16:15 »

QKeyEvent + QApplication::postEvent спасет отца русской демократии ))
А можно накидать небольшой примерчик....дело в том,что я хочу вводить пароль,когда выполняю команду sudo...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 19.