C++ Qt MainWindow 窗口设计与实现 - 鼠标键盘事件处理
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE
class MainWindow : public QMainWindow { Q_OBJECT
public: MainWindow(QWidget *parent = nullptr); ~MainWindow();
static WNDPROC lpPrevWndFunc;
//自动判断编码格式
QString GetCorrectUnicode(const QByteArray &ba);
void clicked_bt_load(bool clicked);
void clicked_bt_save(bool clicked);
void clicked_bt_save_as(bool clicked);
void clicked_bt_replace(bool clicked);
static LRESULT CALLBACK func_Message(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
private: Ui::MainWindow *ui; HWND hwnd; }; #endif // MAINWINDOW_H
mainwindow.cpp文件 #include "mainwindow.h" #include "ui_mainwindow.h"
WNDPROC MainWindow::lpPrevWndFunc = nullptr; // 定义静态变量 lpPrevWndFunc
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) {
ui->setupUi(this);
//设置窗口透明度:
this->setWindowOpacity(0.8);
connect(ui->bt_load,&QPushButton::clicked,this,&clicked_bt_load);
connect(ui->bt_save,&QPushButton::clicked,this,&clicked_bt_save);
connect(ui->bt_save_as,&QPushButton::clicked,this,&clicked_bt_save_as);
connect(ui->bt_replace,&QPushButton::clicked,this,&clicked_bt_replace);
//获取窗口的句柄
HWND hwnd=(HWND)(this->winId());
//hook原始输入数据 键盘
if (lanrenAPI::hookRawInputData(hwnd,HID_USAGE_GENERIC_KEYBOARD)==0){
QMessageBox::information(this,"错误!","创建原始键盘数据设备!");
}
//hook原始输入数据 鼠标
if (lanrenAPI::hookRawInputData(hwnd,HID_USAGE_GENERIC_MOUSE)==0){
QMessageBox::information(this,"错误!","创建原始鼠标数据设备!");
}
WNDPROC lpPrevWndFunc;
//建立消息机制,收到数据会通知
lpPrevWndFunc=(WNDPROC)SetWindowLongPtr(hwnd,GWLP_WNDPROC,(LONG_PTR)&func_Message);
} MainWindow::~MainWindow() { delete ui; }
void MainWindow::clicked_bt_load(bool clicked){
QString fileName= QFileDialog::getOpenFileName(this,"导入脚本","C:\\Users\\Administrator",tr("TEXT (*.txt)"));
//读取内容 放到textEdit中
//默认编码格式是 utf-8
QFile file(fileName);
//设置打开方式
file.open(QIODeviceBase::ReadOnly);
while(!file.atEnd()){
QByteArray array= file.readLine();
QTextCodec * codec=QTextCodec::codecForName(GetCorrectUnicode(array).toLatin1());
ui->pte_jb->moveCursor(QTextCursor::End);
ui->pte_jb->insertPlainText(codec->toUnicode(array));
}
//关闭文件
file.close();
ui->cb_history->addItem(fileName);
} void MainWindow::clicked_bt_save(bool clicked){
QString str=ui->pte_jb->toPlainText();
char* ch;
QByteArray ba = str.toUtf8(); // must
ch=ba.data();
QFile file(ui->cb_history->currentText());
//写文件
file.open(QIODevice::WriteOnly);
file.write(ch);
file.close();
} void MainWindow::clicked_bt_save_as(bool clicked){ QString fileName= QFileDialog::getSaveFileName(this,"另存脚本","C:\Users\Administrator",tr("TEXT (.txt)")); char ch; QByteArray ba = fileName.toUtf8(); // must ch=ba.data();
QFile file(ui->cb_history->currentText());
//写文件
file.open(QIODevice::WriteOnly);
file.write(ch);
file.close();
}
void MainWindow::clicked_bt_replace(bool clicked){ LARGE_INTEGER start; QueryPerformanceCounter(&start);
lanrenAPI::setWindowsMousePenetrate(hwnd,true);
LARGE_INTEGER end;
QueryPerformanceCounter(&end);
qDebug() << end.QuadPart-start.QuadPart;
} LRESULT APIENTRY func_Message( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam) // second message parameter { if (uMsg==RID_INPUT){ RAWINPUT rawdata; GetRawInputData((HRAWINPUT)lParam,RID_INPUT,&rawdata,(PUINT)40,16); switch (rawdata.header.dwType) { case RIM_TYPEKEYBOARD: qDebug() <<"键盘数据到达";
case RIM_TYPEMOUSE:
qDebug() <<"鼠标数据到达";
}
}
return CallWindowProcA (MainWindow::lpPrevWndFunc, hwnd, uMsg, wParam, lParam);
} //自动判断编码格式 QString MainWindow::GetCorrectUnicode(const QByteArray &ba) { QTextCodec::ConverterState state; QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QString text = codec->toUnicode( ba.constData(), ba.size(), &state); if (state.invalidChars > 0) { text = QTextCodec::codecForName( "GBK" )->toUnicode(ba); return QString("GBK"); } else { text = ba; return QString("UTF-8"); } }
原文地址: https://www.cveoy.top/t/topic/nr7l 著作权归作者所有。请勿转载和采集!