Qt鼠标点击模拟错误(自动点击)

时间:2017-05-02 07:44:57

标签: qt mouse hwnd

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMouseEvent>
#include <QTimer>
#include <QWidget>
#include <windowsx.h>
#include <Windows.h>
#include <QtTest>
#include <QDesktopWidget>
#include <QApplication>

std::vector<QPoint> poz;
int i=0;
int a=0;
double timer_time=10;
bool certain=false;
bool mouse_clicked=true;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->centralWidget->setStyleSheet("background-color: #535353;" "color: white;");
    ui->click_on->setStyleSheet("color: #ceb008;");
    ui->speed_label->setText(QString::number(timer_time));
    //this->setWindowFlags(Qt::WindowStaysOnTopHint);


    this->setWindowFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint);  //no_frames and always_on_top

    Qt::X11BypassWindowManagerHint;

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(clicked()));        //set cursor position timer

    timer_move = new QTimer(this);
    connect(timer_move, SIGNAL(timeout()), this, SLOT(repeat()));    //move cursor timer

    timer_points = new QTimer(this);
    connect(timer_points, SIGNAL(timeout()), this, SLOT(points()));   //points timer
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_start_clicked()
{
    if (!certain) timer->start(timer_time);
    else timer_points->start(timer_time);

}

void MainWindow::on_stop_clicked()
{
    timer->stop();
}

void MainWindow::clicked()
{
        p = QCursor::pos();
        poz.push_back(p);
        ui->xy->setText("x: "+QString::number(p.rx())+"  y: "+QString::number(p.ry()));
        ui->list->appendPlainText("x: "+QString::number(poz[i].rx())+"  y: "+QString::number(poz[i].ry()));
        i++;
}

void MainWindow::on_hide_clicked()
{
    this->setWindowFlags(Qt::WindowStaysOnBottomHint);
}

void MainWindow::on_off_clicked()
{
    exit(0);
}

void MainWindow::on_repeat_clicked()
{
    ui->repeat->setStyleSheet("color: #ceb008;");
    repeat();
}

void MainWindow::repeat(){
    //int x=1027;
    //int y=322;
    int x=rand()%1920;
    int y=rand()%1080;
    on_stop_clicked();
    if(a==0) {timer_move->start(timer_time);}
    if(a<i) {
        this->cursor().setPos(poz[a].rx(), poz[a].ry());
       // QPointF p(rand()%1920,rand()%1080);
       // QMouseEvent(QEvent::MouseButtonPress, p, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
       // QMouseEvent(QEvent::MouseButtonRelease, p, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
       //QTest::mousePress(this,);
      // QTest::mouseRelease();
        //QTest::mouseClick(this,Qt::LeftButton,Qt::NoModifier,poz[a]);
        // QTest::mouseClick (this, Qt::LeftButton, Qt::NoModifier, QPoint(660, 1060), 100);
        //QWidget *d = QApplication::desktop()->screen();
        //QTest::mouseClick(d, Qt::LeftButton, Qt::NoModifier, QPoint(x,y));


        HWND h = GetForegroundWindow();

        WORD mouseX = 10;// x coord of mouse

        WORD mouseY = 10;// y coord of mouse

        PostMessage(h,WM_LBUTTONDOWN,0,MAKELPARAM(mouseX,mouseY));


        //QMouseEvent e(QEvent::MouseButtonPress, poz[a], Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
        //QApplication::sendEvent(ui->centralWidget, &e);
        a++;}
    else a=0;
}

void MainWindow::on_repeat_off_clicked()
{
    timer_move->stop();
    a=0;

    ui->repeat->setStyleSheet("color: white;");
}

void MainWindow::on_points_clicked()
{
    if (certain==false) {
        certain=true;
        ui->points->setStyleSheet("color: #ceb008;");
    }
    else {
        certain=false;
        ui->points->setStyleSheet("color: white;");
    }
}

void MainWindow::keyReleaseEvent(QKeyEvent *e){
    switch(e->key()){
    case Qt::Key_Comma: clicked();
        e->accept();
        break;
    }
}

void MainWindow::points(){
    p = QCursor::pos();
    ui->xy->setText("x: "+QString::number(p.rx())+"  y: "+QString::number(p.ry()));
}

void MainWindow::on_clear_clicked()
{
    timer->stop();
    timer_move->stop();
    poz.erase(poz.begin(),poz.end());
    i=0;
    a=0;
    timer_time=10;
    certain=false;
    ui->xy->setText("");
    ui->list->clear();

}
void MainWindow::on_speed_clicked()
{
    ui->speed_label->setReadOnly(false);
    ui->speed->setStyleSheet("color: #ceb008;");
}

void MainWindow::on_speed_label_textChanged()
{
    ui->speed_label->setReadOnly(true);
    timer_time=(ui->speed_label->toPlainText()).toDouble();
    ui->speed->setStyleSheet("color: white;");

}

void MainWindow::on_click_on_clicked()
{
    if (mouse_clicked) {
        ui->click_on->setStyleSheet("color: white;");
        mouse_clicked=false;
    }
    else {
        ui->click_on->setStyleSheet("color: #ceb008;");
        mouse_clicked=true;}
}

mainwidnow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    QTimer *timer;          //timer for capture a cursor
    QTimer *timer_move;     //timer for set cursor position
    QTimer *timer_points;   //timer for certain points
    QPoint p;

private slots:

    void on_start_clicked();

    void on_stop_clicked();

    void clicked();

    void on_hide_clicked();

    void on_off_clicked();

    void on_repeat_clicked();

    void repeat();

    void on_repeat_off_clicked();

    void on_points_clicked(); //choose points with tab

    void points();

    void keyReleaseEvent(QKeyEvent *e);

    void on_clear_clicked();

    void on_speed_clicked();

    void on_speed_label_textChanged();

    void on_click_on_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

的main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

autoclicker.pro

#-------------------------------------------------
#
# Project created by QtCreator 2017-04-30T09:25:20
#
#-------------------------------------------------

QT       += core gui testlib

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = autoclicker
TEMPLATE = app

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

mainwindow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>419</width>
    <height>431</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <widget class="QStackedWidget" name="gridStackedWidget">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
      <width>421</width>
      <height>381</height>
     </rect>
    </property>
    <widget class="QWidget" name="gridStackedWidgetPage1">
     <layout class="QGridLayout" name="gridLayout">
      <property name="leftMargin">
       <number>10</number>
      </property>
      <property name="topMargin">
       <number>10</number>
      </property>
      <property name="rightMargin">
       <number>10</number>
      </property>
      <property name="bottomMargin">
       <number>10</number>
      </property>
      <property name="verticalSpacing">
       <number>25</number>
      </property>
      <item row="10" column="1">
       <widget class="QTextEdit" name="speed_label">
        <property name="layoutDirection">
         <enum>Qt::LeftToRight</enum>
        </property>
        <property name="readOnly">
         <bool>true</bool>
        </property>
       </widget>
      </item>
      <item row="6" column="1">
       <widget class="QPushButton" name="repeat">
        <property name="text">
         <string>REPEAT (SHIFT + R)</string>
        </property>
        <property name="shortcut">
         <string>Shift+R</string>
        </property>
       </widget>
      </item>
      <item row="3" column="0">
       <widget class="QPushButton" name="points">
        <property name="enabled">
         <bool>true</bool>
        </property>
        <property name="text">
         <string>CHOOSE POINTS (SHIFT + P) - PRESS COMMA ( , )</string>
        </property>
        <property name="shortcut">
         <string>Shift+P</string>
        </property>
       </widget>
      </item>
      <item row="2" column="0">
       <widget class="QPushButton" name="start">
        <property name="text">
         <string>START (SHIFT + S)</string>
        </property>
        <property name="shortcut">
         <string>Shift+S</string>
        </property>
       </widget>
      </item>
      <item row="3" column="1">
       <widget class="QLineEdit" name="xy">
        <property name="maximumSize">
         <size>
          <width>195</width>
          <height>16777215</height>
         </size>
        </property>
       </widget>
      </item>
      <item row="1" column="0">
       <widget class="QRadioButton" name="hide">
        <property name="text">
         <string>HIDE (SHIFT + H)</string>
        </property>
        <property name="shortcut">
         <string>Shift+H</string>
        </property>
       </widget>
      </item>
      <item row="6" column="0" rowspan="3">
       <widget class="QPlainTextEdit" name="list"/>
      </item>
      <item row="2" column="1">
       <widget class="QPushButton" name="stop">
        <property name="text">
         <string>STOP (SHIFT + SPACE)</string>
        </property>
        <property name="shortcut">
         <string>Shift+Space</string>
        </property>
        <property name="autoRepeat">
         <bool>false</bool>
        </property>
       </widget>
      </item>
      <item row="7" column="1">
       <widget class="QPushButton" name="repeat_off">
        <property name="text">
         <string>REPEAT OFF (SHIFT + F)</string>
        </property>
        <property name="shortcut">
         <string>Shift+F</string>
        </property>
       </widget>
      </item>
      <item row="1" column="1">
       <widget class="QRadioButton" name="off">
        <property name="text">
         <string>OFF (SHIFT +  O)</string>
        </property>
        <property name="shortcut">
         <string>Shift+O</string>
        </property>
       </widget>
      </item>
      <item row="10" column="0">
       <widget class="QPushButton" name="speed">
        <property name="text">
         <string>SET SPEED (SHIFT + A)</string>
        </property>
        <property name="shortcut">
         <string>Shift+A</string>
        </property>
       </widget>
      </item>
      <item row="8" column="1">
       <widget class="QPushButton" name="clear">
        <property name="text">
         <string>CLEAR (SHIFT + C)</string>
        </property>
        <property name="shortcut">
         <string>Shift+C</string>
        </property>
       </widget>
      </item>
      <item row="11" column="0">
       <widget class="QPushButton" name="click_on">
        <property name="text">
         <string>MOUSE CLICK ON/OFF (SHIFT + M)</string>
        </property>
        <property name="shortcut">
         <string>Shift+M</string>
        </property>
       </widget>
      </item>
     </layout>
    </widget>
   </widget>
  </widget>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

为什么会出错?

mainwindow.obj:-1:błąd:LNK2019:未解析的外部符号__imp_GetForegroundWindow在函数“private:void __cdecl MainWindow :: repeat(void)”中引用(?repeat @ MainWindow @@ AEAAXXZ)

mainwindow.obj:-1:błąd:LNK2019:未解析的外部符号__imp_PostMessageW在函数“private:void __cdecl MainWindow :: repeat(void)”中引用(?repeat @ MainWindow @@ AEAAXXZ)

如何做到这一点?我希望无效重复鼠标点击屏幕(甚至在应用程序之外)。怎么做?

1 个答案:

答案 0 :(得分:0)

(代表OP发布解决方案)

现在有效。谢谢。我用过:

LIBS += -luser32

在我的项目文件中:

mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

在我的代码中。