Qt:Qt實現網頁自動重新整理工具
阿新 • • 發佈:2018-12-08
使用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; }