1. 程式人生 > >Qt:Qt實現網頁自動重新整理工具

Qt:Qt實現網頁自動重新整理工具

使用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;
}


介面

在這裡插入圖片描述