VB实现网页源代码获取小程序实战项目

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这是一个基于Visual Basic开发的实用小程序,能够输入指定网址并获取对应网页的HTML源代码。程序利用HTTP请求(如MSXML2.ServerXMLHTTP对象)抓取网页内容,结合WebBrowser控件展示网页与源码,并通过事件驱动机制响应用户操作。项目涵盖HTTP通信、HTML内容解析、用户界面设计、异常处理及异步优化等关键技术,适合VB初学者学习网络编程核心原理。经调试测试,程序稳定运行,是典型的“VB源码-网络相关”教学案例。

VB网络编程实战:打造高可用网页源码抓取工具

在信息爆炸的今天,每天有超过 20亿个网页 被访问、分析和引用。无论是做竞品调研、SEO优化还是数据挖掘,快速准确地获取目标页面的原始HTML内容,已经成为许多开发者和分析师的日常刚需。然而,当你面对一个没有API接口的老牌网站时,传统浏览器“右键→查看源代码”不仅效率低下,还难以实现自动化处理。

这时候,Visual Basic 这位“老将”依然能派上大用场!💡虽然它诞生于上世纪90年代,但凭借与Windows系统的深度集成、简洁直观的语法以及强大的COM组件支持,VB6/VBA仍然是中小型企业内部工具开发中的常青树——尤其是在财务报表生成、办公自动化、小型爬虫等领域。

你可能要问:“都2025年了,谁还在用VB?”
别急,先看几个真实场景👇:

  • 某制造企业需要每日从供应商门户抓取最新报价单;
  • 某教育机构希望批量下载公开课程页面用于离线归档;
  • 一位独立开发者想构建自己的本地搜索引擎原型;

这些任务不需要复杂的分布式架构,也不追求每秒百万请求的性能极限,而是一个 稳定、可控、可维护的小型桌面工具 。而这,正是VB最擅长的战场!

所以,与其纠结“是否过时”,不如换个角度思考: 如何让这门经典语言,在现代网络环境中焕发新生?


我们今天要做的,就是用VB6亲手打造一款功能完整的「网页源码查看器」——不仅能实时加载远程网页并渲染显示,还能提取其原始HTML代码,进行语法高亮、自动缓存、本地保存等一系列专业级操作。整个过程不依赖任何第三方库(除了系统自带的COM组件),完全原生实现,适合零基础入门或作为企业内控工具模板。

准备好了吗?让我们从最底层开始,一步步揭开VB网络通信的神秘面纱。🚀

COM组件驱动的网络通信机制

VB本身并没有内置HTTP协议栈,这意味着它不能像Python的 requests 或C#的 HttpClient 那样直接发起网络请求。那它是怎么上网的呢?

答案是: 借助Windows操作系统提供的COM组件

COM(Component Object Model)是微软推出的一种跨语言对象复用技术,允许不同编程环境之间共享功能模块。简单来说,VB就像一个指挥官,自己不动手,而是调用那些早已写好、经过验证的“士兵”来完成具体工作。

在VB中,常用的HTTP客户端组件有两个:

组件名称 CLSID / ProgID 特点
MSXML2.ServerXMLHTTP MSXML2.ServerXMLHTTP.6.0 高性能,支持同步/异步,适合后台任务
WinHttpRequest WinHttp.WinHttpRequest.5.1 更轻量,脚本友好,错误提示更清晰

它们本质上都是对Windows底层WinINet或WinHTTP API的封装,通过COM接口暴露给VB调用。你可以把它们理解为“浏览器背后的引擎”。

举个例子,下面这段代码就能让你的VB程序发出第一个GET请求:

Dim http As Object
Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")
http.open "GET", "https://jsonplaceholder.typicode.com/posts/1", False
http.send
Debug.Print http.responseText

是不是很像JavaScript里的XHR?没错,其实IE浏览器早期的AJAX就是基于这个组件实现的!

⚠️ 注意这里的 .open 第三个参数是 False ,表示 同步请求 。这意味着程序会在这里停下来,直到服务器返回结果或者超时。如果你把这个值改成 True ,就变成了异步模式,需要用事件回调来接收响应。

这种“借力打力”的设计思路非常聪明——既避免了重复造轮子,又保证了稳定性和安全性。毕竟,这些组件已经随Windows系统经历了数十年的实际考验。

不过也有代价:你需要确保目标机器安装了对应的MSXML版本。幸运的是, v6.0 从Windows Vista起就是默认组件,基本无需额外部署。

同步 vs 异步:选择合适的请求模式

在GUI应用中,网络请求的阻塞性问题不容忽视。想象一下,用户点击“获取源码”按钮后,界面瞬间卡住几秒钟,鼠标变成沙漏,甚至弹出“未响应”警告……这样的体验显然不可接受。

这就是为什么我们必须认真对待 同步与异步 的选择。

同步请求(Synchronous)

优点:
- 编程逻辑简单,流程线性;
- 适合后台服务、定时任务等非交互场景;

缺点:
- 阻塞主线程,导致UI冻结;
- 用户无法进行其他操作,容易误以为程序崩溃;

示例代码如下:

Sub SyncRequest()
    Dim xhr As Object
    Set xhr = CreateObject("MSXML2.ServerXMLHTTP.6.0")

    xhr.Open "GET", "https://api.example.com/data", False  ' ← 注意这里是False
    xhr.Send

    If xhr.Status = 200 Then
        Debug.Print xhr.ResponseText
    Else
        Debug.Print "Error: " & xhr.Status
    End If
End Sub

这段代码看似干净利落,但在窗体程序中运行时,整个界面都会被锁死,直到请求完成。

异步请求(Asynchronous)

优点:
- 不阻塞UI,用户体验流畅;
- 支持并发多个请求;
- 可结合进度条提供实时反馈;

缺点:
- 回调嵌套复杂,调试困难;
- 错误处理需格外小心;

使用异步模式的关键在于绑定事件处理器:

Dim WithEvents asyncHttp As MSXML2.XMLHTTP60

Private Sub cmdFetch_Click()
    Set asyncHttp = New MSXML2.XMLHTTP60
    asyncHttp.Open "GET", txtURL.Text, True  ' ← 第三个参数为True
    asyncHttp.Send
End Sub

Private Sub asyncHttp_OnReadyStateChange()
    Select Case asyncHttp.ReadyState
        Case 4:  ' READYSTATE_COMPLETE
            If asyncHttp.Status = 200 Then
                rtbSource.Text = asyncHttp.ResponseText
            Else
                MsgBox "请求失败:" & asyncHttp.Status
            End If
    End Select
End Sub

看到没?我们用了 WithEvents 关键字声明了一个带事件的对象变量,并通过 OnReadyStateChange 事件监听状态变化。这种方式虽然灵活,但一旦涉及多个并发请求,管理起来就会变得非常棘手。

因此,对于初学者而言,一个折中的方案是: 在同步请求中穿插 DoEvents

xhr.Open "GET", url, False
xhr.Send  ' 开始阻塞...

' 在等待期间释放控制权,允许界面重绘
DoEvents

DoEvents 的作用是告诉操作系统:“我现在空闲,请处理一下消息队列里的事情。”这样一来,哪怕主线程仍在执行网络请求,窗口也能正常刷新、按钮可以点击、进度条可以动画——看起来就像是“非阻塞”的。

当然,这不是真正的多线程,也不能解决CPU密集型任务的问题,但对于大多数轻量级爬虫来说,已经足够用了。👍

解决中文乱码的核心钥匙:编码智能识别

如果你曾经尝试用VB抓取中文网页,一定遇到过这样的画面:

文件内容为:这是一篇测试文ç«

这是典型的UTF-8字节流被ANSI解码后的结果。问题出在哪?

关键就在于 responseText 属性的工作方式。

当我们调用 xhr.ResponseText 时,VB背后的COM组件会自动将二进制响应体转换成字符串。但用什么编码?它主要依赖两个信息来源:

  1. HTTP响应头中的 Content-Type 字段,例如:
    Content-Type: text/html; charset=utf-8

  2. 如果头部未指定,则使用系统默认编码(通常是GB2312或GBK)

但如果服务器压根没写 charset ,或者写了却是错的呢?比如实际是UTF-8却声明为ISO-8859-1,那就只能靠猜了。

策略一:优先解析HTTP头

我们可以手动读取 Content-Type 来判断编码:

Function GetCharsetFromHeader(http As Object) As String
    Dim contentType As String
    contentType = http.GetResponseHeader("Content-Type")

    If InStr(contentType, "charset=") > 0 Then
        GetCharsetFromHeader = Split(Split(contentType, "charset=")(1), ";")(0)
    Else
        GetCharsetFromHeader = "utf-8"  ' 默认fallback
    End If
End Function

策略二:解析HTML中的meta标签

很多网站会在HTML里通过 <meta> 声明编码:

<meta charset="UTF-8">
<meta http-equiv="Content-Type" content="text/html; charset=gbk">

我们可以用正则表达式提取这些信息:

Function ExtractCharsetFromMeta(html As String) As String
    Dim regex As Object: Set regex = CreateObject("VBScript.RegExp")

    regex.IgnoreCase = True
    regex.Global = False

    ' 匹配 <meta charset="xxx">
    regex.Pattern = "<meta\s+charset\s*=\s*[\"']?([a-zA-Z0-9\-]+)"
    If regex.Test(html) Then
        ExtractCharsetFromMeta = regex.Execute(html)(0).SubMatches(0)
        Exit Function
    End If

    ' 匹配 <meta http-equiv="Content-Type"...charset=xxx>
    regex.Pattern = "http-equiv\s*=\s*['""]Content-Type['""][^>]+content\s*=\s*['""][^'""]*charset=([a-zA-Z0-9\-]+)"
    If regex.Test(html) Then
        ExtractCharsetFromMeta = regex.Execute(html)(0).SubMatches(0)
        Exit Function
    End If

    ExtractCharsetFromMeta = "utf-8"
End Function

策略三:检查BOM(Byte Order Mark)

UTF-8文件有时会在开头加上三个字节的BOM标记: EF BB BF 。虽然W3C建议不要加,但不少编辑器仍会保留。

我们可以通过检查前几个字节来判断:

If UBound(binData) >= 2 Then
    If binData(0) = &HEF And binData(1) = &HBB And binData(2) = &HBF Then
        guessedCharset = "utf-8"
    End If
End If

最终解决方案:分层探测 + 手动解码

真正可靠的策略是 绕开 responseText ,直接使用 responseBody 配合ADODB.Stream进行精准控制

Dim binData() As Byte
binData = http.ResponseBody  ' 获取原始字节流

Dim stream As Object
Set stream = CreateObject("ADODB.Stream")
stream.Type = 1  ' adTypeBinary
stream.Open
stream.Write binData
stream.Position = 0

' 动态设置编码
stream.Type = 2  ' adTypeText
stream.Charset = detectedCharset  ' 来自上述三种策略之一
Dim decodedText As String
decodedText = stream.ReadText(-1)  ' -1表示读取全部
stream.Close

这样我们就掌握了编码转换的主动权,再也不怕乱码困扰啦!🎉

构建双窗格网页查看器:UI设计的艺术

一个好的工具,不仅要能干活,还得好看、好用。

我们的最终目标是做一个类似Chrome DevTools的双窗格布局:左边是 WebBrowser 控件渲染的真实网页,右边是 RichTextBox 展示的原始源码,两者联动,相得益彰。

控件选型与布局技巧

控件 用途 推荐配置
WebBrowser 显示渲染后的网页 来自Microsoft Internet Controls (SHDocVw.dll)
RichTextBox 展示带颜色的HTML源码 使用 RichTextBox ActiveX Control
TextBox + CommandButton URL输入与提交 支持回车触发
StatusBar 显示状态信息 分三部分:状态、URL、加载时间
ProgressBar 加载进度指示 可选,提升交互感

在VB6设计器中拖拽布局后,记得在 Form_Resize 事件中动态调整尺寸:

Private Sub Form_Resize()
    On Error Resume Next  ' 防止最小化时报错

    Dim splitPoint As Long
    splitPoint = Me.ScaleWidth * 0.5  ' 左右各占一半

    WebBrowser1.Move 0, 600, splitPoint, Me.ScaleHeight - 600
    RichTextBox1.Move splitPoint, 600, Me.ScaleWidth - splitPoint, Me.ScaleHeight - 600
    TextBox1.Move 120, 120, Me.ScaleWidth * 0.7, 375
    Command1.Move Me.ScaleWidth * 0.72, 120, 800, 375
    StatusBar1.Move 0, Me.ScaleHeight - 600, Me.ScaleWidth, 600
End Sub

这里用到了VB经典的 ScaleWidth Move 方法,单位是缇(twip),1英寸=1440缇,习惯就好。

实现语法高亮:让代码闪闪发光 ✨

RichTextBox 之所以强大,是因为它支持RTF(富文本格式)。我们可以逐段设置字体、颜色、背景,从而实现简单的语法着色。

基本思路是遍历文本,找到HTML标签并着色:

Sub HighlightHTMLKeywords()
    Dim pos As Long: pos = 1
    Dim startTag As Long, endTag As Long
    Dim textLen As Long: textLen = Len(RichTextBox1.Text)

    ' 先清空所有样式
    RichTextBox1.SelStart = 0
    RichTextBox1.SelLength = textLen
    RichTextBox1.SelColor = vbBlack
    RichTextBox1.SelBold = False

    Do While pos <= textLen
        startTag = InStr(pos, RichTextBox1.Text, "<")
        If startTag = 0 Then Exit Do

        endTag = InStr(startTag, RichTextBox1.Text, ">")
        If endTag = 0 Then Exit Do

        ' 设置选区
        With RichTextBox1
            .SelStart = startTag - 1
            .SelLength = endTag - startTag + 1

            ' 判断是否为注释
            If Mid(.Text, startTag + 1, 3) = "!--" Then
                .SelColor = RGB(0, 128, 0)  ' 绿色
            Else
                .SelColor = RGB(128, 0, 128)  ' 紫色
                .SelBold = True
            End If
        End With

        pos = endTag + 1
    Loop
End Sub

虽然这只是一次简单的关键词匹配,但对于日常使用已经绰绰有余。进阶玩法还可以加入CSS类名、属性名的不同颜色区分,甚至做成主题切换功能!

实现两窗格联动:点击即定位

理想情况下,当用户在左侧网页中右键某个元素时,右侧应该自动滚动到对应的HTML片段。

遗憾的是,VB6的 WebBrowser 控件并不暴露DOM节点的位置偏移量。但我们可以通过注入JavaScript来间接实现:

Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
    If Not (pDisp Is WebBrowser1.Object) Then Exit Sub

    Dim doc As HTMLDocument
    Set doc = WebBrowser1.Document

    ' 注入脚本,监听右键事件
    Dim script As String
    script = "document.addEventListener('contextmenu', function(e){" & _
             "e.preventDefault();" & _
             "window.external.OnElementClicked(" & _
             "'<' + e.target.tagName.toLowerCase() + '>');" & _
             "});"

    Dim head As IHTMLElement
    Set head = doc.getElementsByTagName("head")(0)
    Dim newScript As IHTMLScriptElement
    Set newScript = doc.createElement("script")
    newScript.text = script
    head.appendChild newScript
End Sub

然后在窗体中定义 OnElementClicked 方法:

Public Sub OnElementClicked(tagName As String)
    Dim pos As Long
    pos = InStr(RichTextBox1.Text, "<" & LCase(tagName))
    If pos > 0 Then
        RichTextBox1.SetFocus
        RichTextBox1.SelStart = pos - 1
        RichTextBox1.SelLength = Len(tagName) + 2
        RichTextBox1.SetFocus
    End If
End Sub

这样一来,用户右键点击任意元素,就能在右侧快速定位到它的标签位置,极大提升了调试效率!

缓存机制与性能优化:让工具更快更稳

频繁请求同一个URL不仅浪费带宽,还会增加被封IP的风险。聪明的做法是引入缓存机制,减少不必要的网络开销。

内存缓存:Collection + 时间戳

最简单的做法是把最近获取的页面存进内存:

Private Type CacheEntry
    Content As String
    Timestamp As Date
End Type

Private m_Cache As Collection

Sub InitCache()
    Set m_Cache = New Collection
End Sub

Function GetFromCache(url As String) As String
    Dim key As String: key = MD5Hash(url)
    Dim entry As CacheEntry

    On Error GoTo notFound
    entry = m_Cache(key)

    ' 检查是否过期(例如5分钟)
    If DateDiff("s", entry.Timestamp, Now) > 300 Then
        m_Cache.Remove key
        GetFromCache = ""
    Else
        GetFromCache = entry.Content
    End If
    Exit Function
notFound:
    GetFromCache = ""
End Function

Sub PutInCache(url As String, content As String)
    Dim key As String: key = MD5Hash(url)
    Dim entry As CacheEntry
    entry.Content = content
    entry.Timestamp = Now

    On Error Resume Next
    m_Cache.Remove key
    m_Cache.Add entry, key
End Sub

这里我们用MD5哈希URL作为键名,避免路径非法字符问题,同时设定TTL(Time To Live)防止缓存无限膨胀。

文件缓存:持久化存储

如果希望关机后仍保留历史记录,可以把缓存写入磁盘:

Sub SaveToFile(url As String, content As String)
    Dim path As String: path = GetCacheFilePath(url)
    Dim fnum As Integer: fnum = FreeFile

    Open path For Output Encoding:65001 As #fnum  ' UTF-8
    Print #fnum, content
    Close #fnum
End Sub

Function FileExists(filePath As String) As Boolean
    On Error Resume Next
    FileExists = (GetAttr(filePath) And vbDirectory) = 0
End Function

目录结构建议按哈希值分组,比如前两位做文件夹名,避免单目录下文件过多:

C:\VB_Cache\a1\b2c3d4e5f6.html

条件请求:节省流量的高级技巧

更进一步,我们可以利用HTTP的条件请求机制(Conditional Request),只在内容更新时才下载全文。

服务器通常会在响应头中提供以下信息:

  • Last-Modified : 最后修改时间
  • ETag : 内容指纹

下次请求时带上:

  • If-Modified-Since: [上次时间]
  • If-None-Match: [上次ETag]

如果内容未变,服务器会返回 304 Not Modified ,此时可以直接使用本地副本。

graph LR
    A[发起请求] --> B{本地是否有缓存?}
    B -- 否 --> C[发送完整GET]
    B -- 是 --> D[检查是否过期?]
    D -- 未过期 --> E[使用缓存]
    D -- 已过期 --> F[发送带If-None-Match的GET]
    F --> G{服务器返回304?}
    G -- 是 --> H[更新有效期,使用旧内容]
    G -- 否 --> I[接收新内容,更新缓存]

这套机制能显著降低带宽消耗,特别适合监控类应用。

完整项目实战:一键打包你的专属抓取工具

现在,让我们把这些零散的技术点整合成一个完整的小程序。

功能清单

✅ 用户输入URL并点击“获取”
✅ 自动检测编码,正确显示中文
✅ 左侧渲染网页,右侧显示源码
✅ 源码支持语法高亮与自动换行
✅ 支持缓存,避免重复请求
✅ 可将源码保存为本地HTML文件
✅ 异常处理完善,不因网络错误崩溃

核心流程图

graph TD
    A[用户输入URL] --> B{URL合法?}
    B -->|否| C[提示错误]
    B -->|是| D[检查内存缓存]
    D -->|命中且有效| E[加载缓存内容]
    D -->|未命中| F[创建WinHttpRequest]
    F --> G[设置User-Agent等Header]
    G --> H[发送同步GET请求]
    H --> I{状态码=200?}
    I -->|否| J[显示错误信息]
    I -->|是| K[提取Content-Type]
    K --> L[解析HTML中的meta编码]
    L --> M[使用ADODB.Stream解码]
    M --> N[写入内存缓存]
    N --> O[填充RichTextBox]
    O --> P[调用Highlight函数]
    P --> Q[WebBrowser导航到该URL]
    Q --> R[更新状态栏]

如何扩展?

这个项目只是一个起点。你可以继续添加以下功能:

🔧 批量处理 :导入CSV文件,循环抓取多个URL
📝 日志记录 :保存每次请求的时间、状态码、耗时
📤 导出格式多样化 :支持JSON、Markdown输出
🔐 代理支持 :应对IP限制
🕒 定时抓取 :结合Timer控件实现周期性采集

甚至可以把它改造成一个轻量级CMS内容同步工具,或是SEO审计助手。


回顾整个旅程,我们从COM组件讲到编码识别,从UI布局谈到缓存策略,一步一步构建出了一个实用的VB网页源码抓取器。你会发现,即使是一门“古老”的语言,只要用得其所,依然能在现代开发中发挥独特价值。

最重要的是,这个过程教会我们一个道理: 真正的工程师,不在于掌握多少时髦框架,而在于能否用手中有限的工具,解决现实世界的问题。

所以,别再问“VB还有没有用”,去动手做一个属于你自己的小工具吧!💪

当你看到那个熟悉的蓝色窗体成功加载出第一行HTML代码时,那份成就感,足以抵过千言万语。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:这是一个基于Visual Basic开发的实用小程序,能够输入指定网址并获取对应网页的HTML源代码。程序利用HTTP请求(如MSXML2.ServerXMLHTTP对象)抓取网页内容,结合WebBrowser控件展示网页与源码,并通过事件驱动机制响应用户操作。项目涵盖HTTP通信、HTML内容解析、用户界面设计、异常处理及异步优化等关键技术,适合VB初学者学习网络编程核心原理。经调试测试,程序稳定运行,是典型的“VB源码-网络相关”教学案例。


本文还有配套的精品资源,点击获取
menu-r.4af5f7ec.gif

2009-09-19 22:38 <DIR> 16进制数转换成十进制16进制转换 2009-09-19 22:38 <DIR> 16进制数转换成十进制16进制转换成二进 2009-09-23 22:37 <DIR> 3d彩旦 2009-09-23 21:51 <DIR> 3d水波纹 2009-09-23 22:03 <DIR> 3d赛车 2009-09-23 22:08 <DIR> 3d飞行 2009-09-23 21:20 <DIR> api类全集 2009-09-23 21:37 <DIR> bmp zhuan jpg 2009-09-23 21:49 <DIR> cad设计 2009-09-23 22:42 <DIR> gsp卫星定位 2009-09-30 19:46 <DIR> mp3播放器 2009-09-19 23:31 <DIR> Ok Clock 2009-09-19 17:23 <DIR> Ok eluosifangkuai 2009-09-20 02:02 <DIR> Ok GIF浏览器 2009-09-19 23:45 <DIR> Ok SendMessage 2009-09-19 17:19 <DIR> OK sonw 2009-09-19 17:48 <DIR> Ok WebBroswer 2009-09-19 23:38 <DIR> OK xms记事本 2009-10-01 11:56 <DIR> ok 锁定计算机的程序 2009-09-19 23:42 <DIR> OkGetDomains 2009-09-19 23:42 <DIR> OkMP3DLL 2009-09-19 22:23 <DIR> Okwindows扫雷源程序 2009-09-19 18:44 <DIR> Ok一个倒计时的程序,时间到则关闭系统   2009-09-19 22:30 <DIR> Ok一个好玩的拼图游戏 2009-09-20 00:01 <DIR> Ok一个完整的Telnet程序   2009-09-20 02:09 <DIR> OK一个小的日历程序 2009-09-19 23:57 <DIR> Ok一个比较完整的源代码 定时提醒 1.0 2009-09-19 20:37 <DIR> Ok一个非常Cool的图像编辑软件 2009-09-20 00:27 <DIR> Ok个简单的计算器 2009-09-19 23:51 <DIR> Ok中国象棋的源程序,支持网络 2009-09-20 02:09 <DIR> Ok关机重启动的程序 2009-09-22 19:18 <DIR> Ok反派 2009-09-19 23:54 <DIR> Ok后天美丽 2009-09-19 17:36 <DIR> Ok图象浏览器 2009-09-19 23:40 <DIR> Ok声音 2009-09-20 00:23 <DIR> Ok如何编写录音机程序 2009-09-19 23:52 <DIR> Ok密码查看器 2009-09-20 02:14 <DIR> Ok扫雷 2009-09-19 20:46 <DIR> Ok指针式的时钟 2009-09-19 17:46 <DIR> Ok数字发生器 2009-09-21 00:00 <DIR> Ok数码钟 2009-09-20 18:13 <DIR> Ok旋转立方体的例子。 2009-09-19 23:55 <DIR> Ok检测是否连接到网络 2009-09-19 22:14 <DIR> Ok模拟DOS窗口   2009-09-27 12:00 <DIR> Ok模拟关机程序 2009-09-20 00:17 <DIR> Ok类似Windows画图的软件 2009-09-20 00:22 <DIR> OK自动读取用户登陆名称 2009-09-20 00:26 <DIR> ok记事本代码 2009-09-20 00:16 <DIR> OK透明按钮 2009-09-20 02:14 <DIR> Ok闪烁标题栏效果 2009-09-22 19:19 <DIR> Ok非常cool的文字效果 2009-09-21 16:57 <DIR> Olk类似记事本的简单文本编辑器  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值