Qt:Qt实现网页自动刷新工具

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/qq_29542611/article/details/83352799

使用Qt实现网页刷新工具

前言

最近在看一本《C++黑客编程揭秘和防范》 ,刚开始学,感觉书还不错,有讲一些windows API,不过里面的工具都是使用VC++写的,界面部分使用的mfc的一些API,感觉太不友好来,笔者 想的是 界面部分当然应该可以用,当下桌面端最流行的 Qt 来写呀,windows api相关的可以直接 引入相关的头文件即可。
说的容易,做的难,以前没学过windows api,使用FindWindow获取窗口句柄 一直获取不到,这个问题 卡了我一周吧。应该是如下几个问题导致的:

  1. 在MSDN找到的是FindWindowA函数 引用的Winuser.h头文件,应该引入Windows.h使用FindWindow函数
  2. 网页窗口没有放到最前面? 有可能

笔者想的是,用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;
}


界面

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_29542611/article/details/83352799