本代码实现了鼠标在桌面上移动时,按下键盘的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;
}