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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Эмуляция клика мыши  (Прочитано 24481 раз)
mcrads
Гость
« : Декабрь 15, 2009, 09:14 »

Подскажите пожалуйста, как проэмулировать клик мышки на любой области экрана даже если приложение работает в фоновом режиме??? очень нужно...
QMouseEvent не пойму как в данном случае использовать просто.
Записан
Павел_F.
Гость
« Ответ #1 : Декабрь 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. прямо в конструкторе задаеш какой именно, где( относительно целевого виджета), состояник кнопок мыши. И отправляеш его в нужный тебе виджет.
Записан
spectre71
Гость
« Ответ #2 : Декабрь 15, 2009, 10:52 »

Подскажите пожалуйста, как проэмулировать клик мышки на любой области экрана даже если приложение работает в фоновом режиме??? очень нужно...
QMouseEvent не пойму как в данном случае использовать просто.

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

Речь не об отправке события QMouseEvent виджету, а об эмуляции нажатия мыши.
Похоже задача решается только черем нативные вызовы.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #3 : Декабрь 15, 2009, 10:59 »

статья в Вики - Как программно симулировать события от "мышки"?
подойдёт?
Записан

Юра.
spectre71
Гость
« Ответ #4 : Декабрь 15, 2009, 11:05 »


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

Записан
mcrads
Гость
« Ответ #5 : Декабрь 15, 2009, 20:20 »

Прошу прощения =) спасибо =) помню что где то тут видел =) поиск по форуму ниче не дал =) а про вики забыл )
Записан
mcrads
Гость
« Ответ #6 : Декабрь 16, 2009, 00:16 »

Увы, Викевская не работает. в упор... ей хоть бы хны. мышкой она не кликает ни даже не шевелит если вызывать
Цитировать
QMouseEvent *event = new QMouseEvent(QEvent::MouseMove, pos, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QCoreApplication::postEvent(widget, event);
вот так =((( не знаю что и делать... последний кусочек остался... в проге...
Записан
gmorgunov
Гость
« Ответ #7 : Декабрь 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 встанет на переданную позицию.
Записан
mcrads
Гость
« Ответ #8 : Декабрь 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);

увы не работает =( почему? как сделать клик по любой области экрана? а не по виджетам приложения? но и по фоновым окнам?
Записан
Dendy
Гость
« Ответ #9 : Декабрь 17, 2009, 01:18 »

По окнам других процессов? Боюсь тут Qt вам не поможет, задача сильно специфическая, к тому же платформозависима.
Записан
mcrads
Гость
« Ответ #10 : Декабрь 20, 2009, 09:01 »

И тем не менее у меня получилось =)
Записан
Marat(Qt)
Гость
« Ответ #11 : Декабрь 20, 2009, 09:44 »

И тем не менее у меня получилось =)
радует что решение все-таки есть, только вот как оно выглядет не расскажете?
Записан
mcrads
Гость
« Ответ #12 : Декабрь 21, 2009, 18:43 »

Решение пришлось все таки привязать к платформе... по сути.... так что выделив все это безобразие #ifndef #endif пишем для каждой платформы свой кусочек кода.....
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #13 : Декабрь 21, 2009, 20:32 »

только через платфорозависимый код. Под Linux можно просмотреть исходники xte:

http://packages.debian.org/lenny/xautomation
Записан
wanick
Гость
« Ответ #14 : Май 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
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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