刷机软件-Duilib界面

本文介绍了一款基于Duilib的网页刷新工具,该工具利用wke浏览器内核实现网页的自动刷新及关键字匹配功能。文章详细分析了其核心线程的工作流程,并提供了相关的源码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言:感谢维护Duilib的各位大牛

1、简介
2、程序分析
3、API学习笔记

简介

界面效果
界面
浏览器内核为wke库,该浏览器小巧又使用方便。这里就不多介绍了,大家可以去看Duilib的demo。
根据搜索框输入的关键字(这里可以输入正则表达式),点击“开始刷机”后,就不断刷新界面并获取网页源码,将源码根据关键字进行正则匹配,匹配完成进行提示。
如果有更好的方法,希望留言给我

程序分析

流程图简介下实现的主要线程
这里写图片描述

DWORD WINAPI RefreshThread(LPARAM lparam)
{
    CMainWnd* pThis = (CMainWnd*)lparam;
    string key = T2ANSI(pThis->m_pSearchEdit->GetText().GetData());

    CURL* myUrl = new CURL(pThis->m_URL);
#define MAX_BUF_LEN (1024*200)
    char* pBuf = new char[MAX_BUF_LEN];
    DWORD dwRead;
    DWORD dwTryTimes = 0;
    CODE_TYPE codeType = unknow;
    DWORD res = 0;

    while (true)
    {
        memset(pBuf, 0, MAX_BUF_LEN);
        res = myUrl->ConnectURL();
        if (res != NULL)
            continue;
        string strPostData("");
        if(!myUrl->sendRequest((char*)strPostData.c_str(),strPostData.length()))
            continue;
        if (!myUrl->EndRequest())
            continue;
        myUrl->ReadData((LPBYTE)pBuf, MAX_BUF_LEN - 1, &dwRead);

        dwTryTimes++;

        if (codeType == unknow)
        {
            codeType = pThis->WedCodeType(pBuf);
        }

        if (codeType == type_gbk)
        {
            if (pThis->MatchKey(pBuf, key.c_str()))
                break;
        }
        else if (codeType == type_utf8)
        {
            if (pThis->MatchKey(pBuf, _U(key.c_str())))
                break;
        }

        pThis->SendMessage(WM_FIND_TIME, dwTryTimes, 0);
    }

    delete[] pBuf;
    delete myUrl;
    pThis->SendMessage(WM_FIND_END, 0, 0);

    return 0;
}

示例源码:https://pan.baidu.com/s/1dF3yGv

API学习笔记

关于Windows提供与http协议通信的API笔记
URL_COMPONENTS

typedef struct {  
  DWORD           dwStructSize;  
  LPTSTR          lpszScheme;   
  DWORD           dwSchemeLength;  
  INTERNET_SCHEME nScheme;      
  LPTSTR          lpszHostName;  
  DWORD           dwHostNameLength;  
  INTERNET_PORT   nPort;  
  LPTSTR          lpszUserName;  
  DWORD           dwUserNameLength;  
  LPTSTR          lpszPassword;  
  DWORD           dwPasswordLength;  
  LPTSTR          lpszUrlPath;  
  DWORD           dwUrlPathLength;  
  LPTSTR          lpszExtraInfo;  
  DWORD           dwExtraInfoLength;  
} URL_COMPONENTS, *LPURL_COMPONENTS;  

dwStructSize:这个结构的大小,以字节为单位。用于版本检查。
lpszScheme:指向包含方案名称的字符串值。
dwSchemeLength:方案名称的长度,以字符表示。
nScheme:互联网协议方案。此成员可以是以下值之一。

INTERNET_SCHEME_HTTP:互联网方案是HTTP协议
INTERNET_SCHEME_HTTPS:互联网方案HTTPS是一种使用安全交易语义的HTTP协议。

lpszHostName:指向包含主机名称的字符串值。
dwHostNameLength:主机名的长度,以字符为单位。
NPORT:端口号。
lpszUserName:指向包含用户名的字符串。
dwUserNameLength:用户名的长度,以字符表示。
lpszPassword:指向包含密码的字符串的指针。
dwPasswordLength:密码的长度,以字符为单位。
lpszUrlPath:指向包含URL路径的字符串的指针。
dwUrlPathLength:URL路径的长度,以字符为单位。
lpszExtraInfo:指向包含额外信息的字符串值
dwExtraInfoLength:无符号长整型值,包含额外信息的长度,以字符为单位。


WinHttpOpen

HINTERNET WINAPI WinHttpOpen(
  _In_opt_  LPCWSTR pwszUserAgent,
  _In_      DWORD dwAccessType,
  _In_      LPCWSTR pwszProxyName,
  _In_      LPCWSTR pwszProxyBypass,
  _In_      DWORD dwFlags
);

功能:WinHttpOpen函数为应用程序初始化使用WinHTTP函数
返回值:返回一个WinHTTP会话句柄。
参数:
pwszUserAgent:指向包含调用WinHTTP函数的应用程序或实体的名称的字符串变量的指针。该名称在HTTP协议中用作用户代理。

dwAccessType:所需的访问类型。这可以是以下值之一。

WINHTTP_ACCESS_TYPE_NO_PROXY直接解析所有主机名而不使用代理。
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY从注册表中检索静态代理或直接配置。 WINHTTP_ACCESS_TYPE_DEFAULT_PROXY不会继承浏览器代理设置。 WinHTTP不与Internet Explorer共享任何代理设置。
WINHTTP_ACCESS_TYPE_NAMED_PROXY将请求传递给代理,除非提供代理旁路列表并且要解析的名称绕过代理。在这种情况下,这个函数使用WINHTTP_ACCESS_TYPE_NAMED_PROXY。

pwszProxyName [in]指向字符串变量的指针,其中包含通过将dwAccessType设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY来指定代理访问时要使用的代理服务器的名称。 WinHTTP函数只识别HTTP的CERN类型代理。如果dwAccessType未设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY,则必须将此参数设置为WINHTTP_NO_PROXY_NAME。

pwszProxyBypass [in]指向字符串变量的指针,当dwAccessType设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY时,该变量包含主机名或IP地址的可选分号分隔列表,该列表不应通过代理进行路由。该列表可以包含通配符。不要使用空字符串,因为WinHttpOpen函数使用它作为代理旁路列表。如果此参数将列表中的“”宏指定为唯一条目,则此函数将绕过不包含句点的任何主机名。如果dwAccessType未设置为WINHTTP_ACCESS_TYPE_NAMED_PROXY,则此参数必须设置为WINHTTP_NO_PROXY_BYPASS。

dwFlags [in]包含指示影响此函数行为的各种选项的标志的无符号长整数值。该参数可以具有以下值。

WINHTTP_FLAG_ASYNC异步使用WinHTTP函数。默认情况下,所有使用返回的HINTERNET句柄的WinHTTP函数都是同步执行的。当这个标志被设置时,调用者需要通过WinHttpSetStatusCallback指定一个回调函数。

WinHttpConnect

HINTERNET WINAPI WinHttpConnect(
  _In_        HINTERNET hSession,
  _In_        LPCWSTR pswzServerName,
  _In_        INTERNET_PORT nServerPort,
  _Reserved_  DWORD dwReserved
);

功能:指定HTTP请求的初始目标服务器,并为该初始目标的HTTP会话返回一个HINTERNET连接句柄。
返回值:成功返回一个HINTERNET连接句柄,失败返回NULL
参数:
hSession [in]先前调用WinHttpOpen返回的有效HINTERNET WinHTTP会话句柄。

pswzServerName [in]指向包含HTTP服务器的主机名的以空字符结尾的字符串。或者,该字符串可以包含以ASCII码表示的站点的IP地址,例如,10.0.1.45。请注意,WinHttp不接受国际主机名称,而不先将其转换为OnlinePunycode。

nServerPort [in]无符号整数,指定建立连接的服务器上的TCP / IP端口。该参数可以是任何有效的TCP / IP端口号,也可以是下列其中一个值。

INTERNET_DEFAULT_HTTP_PORT使用HTTP服务器的默认端口(端口80)。
INTERNET_DEFAULT_HTTPS_PORT使用HTTPS服务器的默认端口(端口443)。选择此端口不会自动建立安全连接。您还必须使用WinHttpOpenRequest中的WINHTTP_FLAG_SECURE标志来指定使用安全事务语义。
INTERNET_DEFAULT_PORT使用端口80作为HTTP,使用端口443作为安全超文本传输​​协议(HTTPS)。

dwReserved [in]该参数是保留的,必须是0。


WinHttpOpenRequest

HINTERNET WINAPI WinHttpOpenRequest(
  _In_  HINTERNET hConnect,
  _In_  LPCWSTR pwszVerb,
  _In_  LPCWSTR pwszObjectName,
  _In_  LPCWSTR pwszVersion,
  _In_  LPCWSTR pwszReferrer,
  _In_  LPCWSTR *ppwszAcceptTypes,
  _In_  DWORD dwFlags
);

功能:创建一个HTTP请求句柄。
返回值:成功返回一个HTTP请求句柄,失败返回NULL

hConnect [in]HINTERNET连接句柄到由WinHttpConnect返回的HTTP会话。

pwszVerb [in]指向包含要在请求中使用的HTTP谓词的字符串。如果此参数为NULL,则该函数使用GET作为HTTP动词。
注意这个字符串应该全部大写。许多服务器将HTTP动词视为区分大小写,并且Internet工程任务组(IETF)请求注释(RFC)仅使用大写字符来拼写这些动词。

pwszObjectName [in]指向包含指定HTTP动词的目标资源名称的字符串的指针。这通常是文件名称,可执行模块或搜索说明符。

pwszVersion [in]指向包含HTTP版本的字符串的指针。如果此参数为NULL,则该函数使用HTTP / 1.1。

pwszReferrer [in]指向一个字符串的指针,该字符串指定从中获取请求pwszObjectName中的URL的文档的URL。如果此参数设置为WINHTTP_NO_REFERER,则不指定引用文档。

ppwszAcceptTypes [in]指向以空字符结尾的字符串指针数组,指定客户端接受的媒体类型。如果此参数设置为WINHTTP_DEFAULT_ACCEPT_TYPES,则客户端不接受任何类型。通常情况下,服务器处理缺乏接受的类型,表明客户端只接受类型为“text / *”的文档;也就是说,只有文本文件 - 没有图片或其他二进制文件。

dwFlags [in]包含Internet标志值的无符号长整数值


WinHttpAddRequestHeaders

BOOL WINAPI WinHttpAddRequestHeaders(
  _In_  HINTERNET hRequest,
  _In_  LPCWSTR pwszHeaders,
  _In_  DWORD dwHeadersLength,
  _In_  DWORD dwModifiers
);

功能:将一个或多个HTTP请求标头添加到HTTP请求句柄。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in]通过调用WinHttpOpenRequest函数返回的HINTERNET句柄。

pwszHeaders [in]指向包含要附加到请求的标头的字符串变量的指针。 除最后一个标题外,每个标题都必须以回车/换行(CR / LF)结束。

dwHeadersLength [in]一个无符号的长整型值,包含pwszHeaders的字符长度。 如果此参数是-1L,则函数假定pwszHeaders是零终止的(ASCIIZ),并计算长度。

dwModifiers [in]包含用于修改此函数的语义的标志的无符号长整数值,取以下值

WINHTTP_ADDREQ_FLAG_ADD添加标题,如果它不存在。 与WINHTTP_ADDREQ_FLAG_REPLACE一起使用。
WINHTTP_ADDREQ_FLAG_ADD_IF_NEW仅在头文件不存在时才添加头文件; 否则,返回错误。
WINHTTP_ADDREQ_FLAG_COALESCE合并相同名称的标题。
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA使用逗号合并相同名称的标头。 
WINHTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON使用分号合并相同名称的标题。
WINHTTP_ADDREQ_FLAG_REPLACE替换或删除标题。 如果标题值为空并且找到标题,则将其删除。 如果该值不是空的,则被替换。

WinHttpSendRequest

BOOL WINAPI WinHttpSendRequest(
  _In_      HINTERNET hRequest,
  _In_opt_  LPCWSTR pwszHeaders,
  _In_      DWORD dwHeadersLength,
  _In_opt_  LPVOID lpOptional,
  _In_      DWORD dwOptionalLength,
  _In_      DWORD dwTotalLength,
  _In_      DWORD_PTR dwContext
);

功能:将指定的请求发送到HTTP服务器。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in]WinHttpOpenRequest返回的HINTERNET句柄。

pwszHeaders [in,可选]指向包含要附加到请求的附加头的字符串的指针。如果没有额外的头文件可以附加,这个参数可以是WINHTTP_NO_ADDITIONAL_HEADERS。

dwHeadersLength [in]一个无符号的长整型值,包含额外标题的长度(以字符为单位)。如果此参数是-1L,并且pwszHeaders不是NULL,则此函数假定pwszHeaders以null结尾,并计算长度。

lpOptional [in,可选]指向缓冲区的指针,该缓冲区包含在请求标头之后立即发送的任何可选数据。该参数通常用于POST和PUT操作。可选数据可以是发布到服务器的资源或数据。如果没有可选的数据发送,则此参数可以是WINHTTP_NO_REQUEST_DATA。
如果dwOptionalLength参数为0,则忽略此参数并将其设置为NULL。
此缓冲区必须保持可用状态,直到请求句柄关闭或对WinHttpReceiveResponse的调用完成。

dwOptionalLength [in]一个无符号的长整型值,包含可选数据的长度(以字节为单位)。如果没有可选的数据要发送,此参数可以为零。
当lpOptional参数不是NULL时,此参数必须包含有效的长度。否则,lpOptional被忽略并设置为NULL。

dwTotalLength [in]一个无符号的长整型值,包含发送总数据的长度(以字节为单位)。该参数指定请求的Content-Length头。如果此参数的值大于dwOptionalLength指定的长度,则可以使用WinHttpWriteData发送附加数据。
对于同一请求,dwTotalLength不得在对WinHttpSendRequest的调用之间进行更改。如果需要更改dwTotalLength,调用者应该创建一个新的请求。

dwContext [in]指向指针大小的变量的指针,该变量包含应用程序定义的值,该值通过请求句柄传递给任何回调函数。


WinHttpReceiveResponse

BOOL WINAPI WinHttpReceiveResponse(
  _In_        HINTERNET hRequest,
  _Reserved_  LPVOID lpReserved
);

功能:等待接收对由WinHttpSendRequest发起的HTTP请求的响应。 当WinHttpReceiveResponse成功完成时,状态码和响应头已被接收,并可供应用程序使用WinHttpQueryHeaders进行检查。 应用程序必须先调用WinHttpReceiveResponse,然后才能使用WinHttpQueryDataAvailable和WinHttpReadData来访问响应实体主体(如果有的话)。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in]由WinHttpOpenRequest返回并由WinHttpSendRequest发送的HINTERNET句柄。 在调用WinHttpReceiveResponse之前,请等到WinHttpSendRequest完成此句柄。

lpReserved [in]该参数是保留的,必须为NULL。


WinHttpReadData

BOOL WINAPI WinHttpReadData(
  _In_   HINTERNET hRequest,
  _Out_  LPVOID lpBuffer,
  _In_   DWORD dwNumberOfBytesToRead,
  _Out_  LPDWORD lpdwNumberOfBytesRead
);

功能:从由WinHttpOpenRequest函数打开的句柄中读取数据。
返回值:成功返回TRUE,失败返回FALSE
参数:
hRequest [in] HINTERNET句柄。必须为此句柄调用WinHttpReceiveResponse或WinHttpQueryDataAvailable,并且必须在WinHttpReadData被调用之前完成。尽管WinHttpReceiveResponse完成后立即调用WinHttpReadData可避免缓冲区副本的花费,但这样做要求应用程序使用固定长度的缓冲区进行读取。

lpBuffer [out]指向接收读取数据的缓冲区的指针。确保此缓冲区保持有效,直到WinHttpReadData完成。

dwNumberOfBytesToRead [in]包含要读取的字节数的无符号长整数值。

lpdwNumberOfBytesRead [out]指向一个无符号长整型变量的指针,它接收读取的字节数。在进行任何工作或错误检查之前,WinHttpReadData将此值设置为零。当使用WinHTTP异步时,总是将此参数设置为NULL并检索回调函数中的信息;不这样做可能会导致内存故障。


WinHttpCloseHandle

BOOL WINAPI WinHttpCloseHandle(
  _In_  HINTERNET hInternet
);

功能:关闭一个HINTERNET句柄

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值