Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: mcrads от Декабрь 15, 2009, 09:14



Название: Эмуляция клика мыши
Отправлено: mcrads от Декабрь 15, 2009, 09:14
Подскажите пожалуйста, как проэмулировать клик мышки на любой области экрана даже если приложение работает в фоновом режиме??? очень нужно...
QMouseEvent не пойму как в данном случае использовать просто.


Название: Re: Эмуляция клика мыши
Отправлено: Павел_F. от Декабрь 15, 2009, 10:46
Цитата: Из Assistant
QMouseEvent::QMouseEvent ( Type type, const QPoint & position, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers )

Constructs a mouse event object.

The type parameter must be one of QEvent::MouseButtonPress, QEvent::MouseButtonRelease, QEvent::MouseButtonDblClick, or QEvent::MouseMove.

The position is the mouse cursor's position relative to the receiving widget. The button that caused the event is given as a value from the Qt::MouseButton enum. If the event type is MouseMove, the appropriate button for this event is Qt::NoButton. The mouse and keyboard states at the time of the event are specified by buttons and modifiers.

The globalPos() is initialized to QCursor::pos(), which may not be appropriate. Use the other constructor to specify the global position explicitly.
что там не понятно?
Делаеш сам QMouseEvent. прямо в конструкторе задаеш какой именно, где( относительно целевого виджета), состояник кнопок мыши. И отправляеш его в нужный тебе виджет.


Название: Re: Эмуляция клика мыши
Отправлено: spectre71 от Декабрь 15, 2009, 10:52
Подскажите пожалуйста, как проэмулировать клик мышки на любой области экрана даже если приложение работает в фоновом режиме??? очень нужно...
QMouseEvent не пойму как в данном случае использовать просто.

что там не понятно?
Делаеш сам QMouseEvent. прямо в конструкторе задаеш какой именно, где( относительно целевого виджета), состояник кнопок мыши. И отправляеш его в нужный тебе виджет.

Речь не об отправке события QMouseEvent виджету, а об эмуляции нажатия мыши.
Похоже задача решается только черем нативные вызовы.


Название: Re: Эмуляция клика мыши
Отправлено: lit-uriy от Декабрь 15, 2009, 10:59
статья в Вики - Как программно симулировать события от "мышки"? (http://prog.org.ru/wiki/index.php?title=Frequently_Asked_Questions#.D0.9A.D0.B0.D0.BA_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.BD.D0.BE_.D1.81.D0.B8.D0.BC.D1.83.D0.BB.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D1.82.D1.8C_.D1.81.D0.BE.D0.B1.D1.8B.D1.82.D0.B8.D1.8F_.D0.BE.D1.82_.22.D0.BC.D1.8B.D1.88.D0.BA.D0.B8.22.3F)
подойдёт?


Название: Re: Эмуляция клика мыши
Отправлено: spectre71 от Декабрь 15, 2009, 11:05
статья в Вики - Как программно симулировать события от "мышки"? (http://prog.org.ru/wiki/index.php?title=Frequently_Asked_Questions#.D0.9A.D0.B0.D0.BA_.D0.BF.D1.80.D0.BE.D0.B3.D1.80.D0.B0.D0.BC.D0.BC.D0.BD.D0.BE_.D1.81.D0.B8.D0.BC.D1.83.D0.BB.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D1.82.D1.8C_.D1.81.D0.BE.D0.B1.D1.8B.D1.82.D0.B8.D1.8F_.D0.BE.D1.82_.22.D0.BC.D1.8B.D1.88.D0.BA.D0.B8.22.3F)
подойдёт?

Цитировать
на любой области экрана



Название: Re: Эмуляция клика мыши
Отправлено: mcrads от Декабрь 15, 2009, 20:20
Прошу прощения =) спасибо =) помню что где то тут видел =) поиск по форуму ниче не дал =) а про вики забыл )


Название: Re: Эмуляция клика мыши
Отправлено: mcrads от Декабрь 16, 2009, 00:16
Увы, Викевская не работает. в упор... ей хоть бы хны. мышкой она не кликает ни даже не шевелит если вызывать
Цитировать
QMouseEvent *event = new QMouseEvent(QEvent::MouseMove, pos, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QCoreApplication::postEvent(widget, event);
вот так =((( не знаю что и делать... последний кусочек остался... в проге...


Название: Re: Эмуляция клика мыши
Отправлено: gmorgunov от Декабрь 16, 2009, 08:14
Можно вот так эмулировать клик левой мыши:
Код:
#include <QtGui>

int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    QMainWindow *window = new QMainWindow;
    QLineEdit *lineEdit= new QLineEdit("The position of cursor is 100,0");
    window->setCentralWidget(lineEdit);
    window->show();
    QMouseEvent *pressedLeftMouseButton = new QMouseEvent(QEvent::MouseButtonPress,
                                                          QPoint(100,0),
                                              Qt::LeftButton,
                                   Qt::LeftButton,
                                   Qt::NoModifier);
    app.postEvent( lineEdit, pressedLeftMouseButton);
    return app.exec();
}
Помотрите конструктор: QMouseEvent ( Type type, const QPoint & position, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers ).
Курсор в lineEdit встанет на переданную позицию.


Название: Re: Эмуляция клика мыши
Отправлено: mcrads от Декабрь 16, 2009, 17:49
Код:
        QDesktopWidget *desk = new QDesktopWidget;
        QPoint pos = desk->mapFromGlobal(QCursor::pos());
        QMouseEvent *mouse = new QMouseEvent(QEvent::MouseButtonPress, pos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
        QCoreApplication::postEvent(desk, mouse);

увы не работает =( почему? как сделать клик по любой области экрана? а не по виджетам приложения? но и по фоновым окнам?


Название: Re: Эмуляция клика мыши
Отправлено: Dendy от Декабрь 17, 2009, 01:18
По окнам других процессов? Боюсь тут Qt вам не поможет, задача сильно специфическая, к тому же платформозависима.


Название: Re: Эмуляция клика мыши
Отправлено: mcrads от Декабрь 20, 2009, 09:01
И тем не менее у меня получилось =)


Название: Re: Эмуляция клика мыши
Отправлено: Marat(Qt) от Декабрь 20, 2009, 09:44
И тем не менее у меня получилось =)
радует что решение все-таки есть, только вот как оно выглядет не расскажете?


Название: Re: Эмуляция клика мыши
Отправлено: mcrads от Декабрь 21, 2009, 18:43
Решение пришлось все таки привязать к платформе... по сути.... так что выделив все это безобразие #ifndef #endif пишем для каждой платформы свой кусочек кода.....


Название: Re: Эмуляция клика мыши
Отправлено: Alex Custov от Декабрь 21, 2009, 20:32
только через платфорозависимый код. Под Linux можно просмотреть исходники xte:

http://packages.debian.org/lenny/xautomation


Название: Re: Эмуляция клика мыши
Отправлено: wanick от Май 12, 2011, 13:31
На днях предо мной встала такая же задача постучал в аську Sickfar, и он любезно поделился решением
выкладываю для хстори, вдруг кому еще понадобится

Код:
#ifdef Q_WS_WIN
#include <w32api.h>
#include <windows.h>
#endif

..........

    #ifdef Q_WS_WIN
            SetCursorPos(pos.x(), pos.y());
            Sleep(1);
            mouse_event(MOUSEEVENTF_MOVE, 0, 0, 0, GetMessageExtraInfo());
            Sleep(1);
            mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, GetMessageExtraInfo());
            Sleep(1);
            mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, GetMessageExtraInfo());
    #endif


Название: Re: Эмуляция клика мыши
Отправлено: keria от Сентябрь 15, 2011, 22:13
Подскажите пожалуйста, как проэмулировать клик мышки на любой области экрана даже если приложение работает в фоновом режиме??? очень нужно...
QMouseEvent не пойму как в данном случае использовать просто.

Здравствуйте уважаемые форумчане. Нашел эту тему в поисковике.

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

Эмуляция должна обходить вот эту систему http://metrika.yandex.ru/promo/webvisor/. Система записывает и показывает движение мышью и другие действия пользователя.
Мне нужно совершить движение и клик в фоновом режиме, но чтобы вебвизор увидел, что движение и клик есть.

Если такое решение принципиально возможно готов обсудить стоимость его реализации.


Название: Re: Эмуляция клика мыши
Отправлено: LisandreL от Сентябрь 15, 2011, 22:30
Что вы понимаете под фоновым режимом? Как должны осуществляться движения - с вашим управлением или по записанной программе?
AutoIt на виртуалке?


Название: Re: Эмуляция клика мыши
Отправлено: keria от Сентябрь 17, 2011, 11:03
Что вы понимаете под фоновым режимом? Как должны осуществляться движения - с вашим управлением или по записанной программе?
AutoIt на виртуалке?

К большому сожалению я не программист и не понимаю многих терминов, но мне очень нужен результат и готов его оплатить.

Под фоновым режимом понимаю, следующее:
Юзер работает в браузере (или не работает). Независимо от его действий открывается невидимое для него окно браузера и там совершаются действия (набор с клавиатуры, переход по ссылке, по записанной программе). Главное, чтобы эти действия были учтены программами типо http://metrika.yandex.ru/promo/webvisor/. Т.е как будто это реальный юзер подвигал мышью и нажал на ссылку.