Qt:Qt实现网页自动刷新工具
使用Qt实现网页刷新工具
前言
最近在看一本《C++黑客编程揭秘和防范》 ,刚开始学,感觉书还不错,有讲一些windows API,不过里面的工具都是使用VC++写的,界面部分使用的mfc的一些API,感觉太不友好来,笔者 想的是 界面部分当然应该可以用,当下桌面端最流行的 Qt 来写呀,windows api相关的可以直接 引入相关的头文件即可。
说的容易,做的难,以前没学过windows api,使用FindWindow获取窗口句柄 一直获取不到,这个问题 卡了我一周吧。应该是如下几个问题导致的:
- 在MSDN找到的是FindWindowA函数 引用的Winuser.h头文件,应该引入Windows.h使用FindWindow函数
- 网页窗口没有放到最前面? 有可能
笔者想的是,用Qt结合window API来实现 书中所实现的工具,因为qt写界面太方便了,qt - 你值得拥有!
代码
这里首先要知道刷新网页窗口的标题,使用spy++工具进行获取(装好了VC++就有了)。自行百度哈。
Qt呢?qt不会?学呀,这么好用的工具,很好学的。
qt代码如下,完整工程,请下载 示例demo,或者git地址下载有问题可留言哟。
#include "widget.h"
#include "ui_widget.h"
#include "Windows.h"
#include <QDebug>
#include <QThread>
#include <QTimer>
#include <QRegExp>
#include <QRegExpValidator>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
myTimer = new QTimer(this);
//刷新按钮 信号槽
connect(ui->beginButton,&QPushButton::clicked,this,&Widget::beginRefresh);
//停止按钮 信号槽
connect(ui->stopButton,&QPushButton::clicked,this,&Widget::stopRefresh);
}
void Widget::beginRefresh(){
QString winTitle = ui->htmlWinTitle->text();
qDebug() << winTitle;
char* ch = winTitle.toUtf8().data();
//我打开的这个网页:https://blog.csdn.net/qq_29542611
//刷新网页窗口的标题:【无欲则刚】30岁回农村 - CSDN博客 - 2345加速浏览器 9.5
qDebug() << ch;
//这里必须转换!不转换会报错: cannot convert 'char*' to 'LPCWSTR {aka const wchar_t*}' for argument '2' to 'HWND__* FindWindowW(LPCWSTR, LPCWSTR)'
LPCWSTR str = (LPCWSTR)ch;
//需要Windows.h头文件
HWND win = ::FindWindow(NULL, str);
if(win != NULL){
qDebug() << "找到窗口:"+winTitle;
}else{
qDebug() << "没有找到窗口!!!";
return;
}
if(myTimer->timerId()!=-1){
//定时器在运行,先关掉
myTimer->stop();
}
QString intervalStr = ui->lineEdit->text();
QRegExp reg("[1-9]");
if( reg.exactMatch(intervalStr)){
int interval = intervalStr.toInt();
//每interval秒刷新一次网页
qDebug() << "间隔时间"<< interval;
myTimer->start(interval*1000);
}else{
qDebug() << "时间间隔请输入1-9的数字";
return;
}
refresh(win);
//设置定时器
connect(myTimer,&QTimer::timeout,[=](){
qDebug() << "执行定时器";
refresh(win);
});
}
void Widget::stopRefresh(){
myTimer->stop();
}
void Widget::refresh(HWND win){
//将指定的窗口设置到最前面并处于激活状态,不然当没有在最前面是不会刷新的。
SetForegroundWindow(win);
PostMessage(win, WM_KEYDOWN, VK_F5,1);
Sleep(50);
PostMessage(win, WM_KEYUP, VK_F5,1);
}
Widget::~Widget()
{
delete ui;
}
还没有评论,来说两句吧...