qt写的windows下获取鼠标所在位置及颜色

460 阅读1分钟

在这里插入图片描述
本代码实现了鼠标在桌面上移动时,按下键盘的Ctrl键,即可获取鼠标位置及该位置的RGB值,并显示在本软件上。 主要用到的是windows的如下几个函数:

HDC dc = GetDC(0);//0表示获取桌面的DC上下文
POINT Mouse;
GetCursorPos(&Mouse);//获取当前鼠标位置
int BGR = GetPixel(dc,Mouse.x,Mouse.y);//获取鼠标位置的BGR颜色

头文件需要包含

#include <Windows.h>
#include <winddi.h>

另外需要手动加载windows的lib模块

#pragma comment  (lib, "User32.lib")
#pragma comment  (lib, "gdi32.lib")

另外int类型的BGR值转QColor方法如下:

int BGR = GetPixel(dc,Mouse.x,Mouse.y);
int red = BGR & 255;
int green = BGR >> 8 & 255;
int blue = BGR >> 16 & 255;
QColor color = QColor(red,green,blue);

mainwindow.h头文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include "processorthread.h"
#include <QColor>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    QString converRGB16HexStr(QColor _color);
public slots:
    void  ShowMousPosColorSlot(QColor color,QPoint pt);
private:
    Ui::MainWindow *ui;
    ProcessorThread mThread;
};
#endif // MAINWINDOW_H

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <Windows.h>
#include <QDebug>
#pragma comment  (lib, "User32.lib")
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&mThread,&ProcessorThread::ShowMousPosColor,this,&MainWindow::ShowMousPosColorSlot);
    mThread.m_bStarted = true;
    mThread.start();
}
MainWindow::~MainWindow()
{
    mThread.m_bStarted = false;
    mThread.wait(1000);
    delete ui;
}
void MainWindow::ShowMousPosColorSlot(QColor color, QPoint pt)
{
    //显示label颜色
    QPalette palette;
    palette.setColor(QPalette::Background,color);
    int nGray = (color.red()+color.green()+color.blue())/3;
    nGray = nGray>127?0:255;
    QColor fontColor = QColor(nGray,nGray,nGray);
    palette.setColor(QPalette::WindowText,fontColor);
    ui->labelColor->setAutoFillBackground(true);
    ui->labelColor->setPalette(palette);
    ui->labelColor->setText(converRGB16HexStr(color));
    //显示鼠标位置:
    QString str = "("+QString::number(pt.x(),10);
    str +=","+QString::number(pt.y(),10);;
    str +=")";
    ui->lineEditPos->setText(str);
    ui->lineEditB->setText(QString::number(color.blue(),10));
    ui->lineEditG->setText(QString::number(color.green(),10));
    ui->lineEditR->setText(QString::number(color.red(),10));
}
QString MainWindow::converRGB16HexStr(QColor _color)
{
     //r的rgb转化为16进制
     QString redStr = QString("%1").arg(_color.red(),2,16,QChar('0'));
     //g的rgb转化为16进制
     QString greenStr = QString("%1").arg(_color.green(),2,16,QChar('0'));
     //b的rgb转化为16进制
     QString blueStr = QString("%1").arg(_color.blue(),2,16,QChar('0'));
     //将各rgb的拼接在一起形成#000000
     QString hexStr = "#"+redStr+greenStr+blueStr;
     //返回hexStr
     return hexStr;
}