最近在SDK下使用WebBrowser遇到了个问题

解决UE WebBrowser H.264黑屏:编译支持专利编解码器的CEF库 在Unreal Engine项目中集成网页功能时,开发者常遇到WebBrowser插件无法播放H.264视频的黑屏问题。这通常源于引擎内置的Chromium Embedded Framework(CEF)版本老旧且默认不包含专利编解码器。CEF作为将Chromium浏览器内核嵌入原生应用的核心技术,其编解码器支持直接影响网页媒体播放能力。通过从源码编译CEF并启用专有编解码器选项,可以彻底解决此兼容性问题,从而让UE应用能够无缝播放YouTube、B站等主流视频网站的内容。这一技术实践不仅提升了WebBro 阅读详情

最近在SDK下使用WebBrowser遇到了个问题,就是VK_TAB加速健,经后来分析,其实Ctrl+C等操作也是不行的,只不过已经事先在框架中执行了ExecWeb操作。

一开始,我还以为是MFC的CHtmlView对WebBrowser的包装过程中也象我处理Ctrl+C处理好了。因此,从早上到今晚的12点,我都试图使用这种方法来解决。就是在DocumetComplete后得到所有的Input link和textarea以及frame,然后实现SetFocusToNext和SetFocusToPrev.等函数。

//////////////////////////
BOOL CHtmlView::SetFocusToNext(LPDISPATCH pHtmlDocument)
{
BOOL bFocus=FALSE;
BOOL bFassCurFocus=FALSE;
IHTMLDocument2 *pDoc=NULL;
pHtmlDocument->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if(pDoc)
{
   IHTMLElementCollection* pColl = NULL;
   //得到所有元素
   if(SUCCEEDED(pDoc->get_all(&pColl)))
   {
    long   nNumElements;  
    if(SUCCEEDED(pColl->get_length(&nNumElements)))
    {
     if(nNumElements)
     {
      IHTMLElement* pActiveElement=NULL;
      if(SUCCEEDED(pDoc->get_activeElement(&pActiveElement)))
      {
       IHTMLFrameBase2* pFrame=NULL;
       if(SUCCEEDED(pActiveElement->QueryInterface(IID_IHTMLFrameBase2,(void**)&pFrame)))
       {
        if(pFrame)
        {
         IHTMLWindow2 *pWin;
         if(SUCCEEDED(pFrame->get_contentWindow(&pWin)))
         {
          if(pWin)
          {
           IHTMLDocument2 *pDoc2=NULL;
           if(SUCCEEDED(pWin->get_document(&pDoc2)))
           {
            if(pDoc2)
            {
             SetFocusToFirst(pDoc2);
             pDoc2->Release();
            }
           }
           pWin->Release();
          }
         }
         pFrame->Release();
        }
       }
       //这里已获得activeElement http://www.wzszf.com/
       long lActSrcIndex;
       pActiveElement->get_sourceIndex(&lActSrcIndex);
       for(long i = 0;i< nNumElements;i++)  
       {
        VARIANT varName;
        varName.vt=VT_UINT;
        varName.lVal   =   i;
        VARIANT varIndex;
        LPDISPATCH lpElementDisp=NULL;
        pColl->item(varName,varIndex,&lpElementDisp);
        {
         if(bFassCurFocus)//过了焦点,出现可焦则焦
         {
          IHTMLElement2* pElement2=NULL;   
          if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLElement2,(void**)&pElement2)))
          {
           IHTMLInputElement2*pInput=NULL;
           IHTMLAnchorElement2* pAnchor=NULL;
           IHTMLTextAreaElement* pTextArea=NULL;
           IHTMLFrameBase2* pFrame=NULL;
           if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLInputElement2,(void**)&pInput))
            ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLAnchorElement2,(void**)&pAnchor))
            ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLTextAreaElement,(void**)&pTextArea))
            ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLFrameBase2,(void**)&pFrame)))
           {
            if(pInput||pAnchor||pTextArea||pFrame)
            {

             if(SUCCEEDED(pElement2->focus()))
              bFocus=TRUE;
             if(pInput)
              pInput->Release();
             if(pAnchor)
              pAnchor->Release();
             if(pTextArea)
              pTextArea->Release();
             if(pFrame&&bFocus)
              pFrame->Release();
             if(bFocus)
             {
              pElement2->Release();
              break;
             }
            }
           }
           pElement2->Release();
          }
         }
         else
         {
          IHTMLElement* pElement=NULL;   
          if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLElement,(void**)&pElement)))
          {
           long lCurSrcIndex;
           pElement->get_sourceIndex(&lCurSrcIndex);
           if(lCurSrcIndex==lActSrcIndex)//找到当前活动元素
           {
            bFassCurFocus=TRUE;
           }
           pElement->Release();
          }
         }
        }
       }//for
       pActiveElement->Release();
      }
     }
    }
    pColl->Release();
   }
   pDoc->Release();
}
return bFocus;
}
//////////////////////////
BOOL CHtmlView::SetFocusToPrev()
{
BOOL bFocus=FALSE;
BOOL bFassCurFocus=FALSE;
LPDISPATCH lpDisp=NULL;
m_pHost->m_pWebBrowser->get_Document(&lpDisp);
IHTMLDocument2 *pDoc=NULL;
lpDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if(pDoc)
{
   IHTMLElementCollection* pColl = NULL;
   //得到所有元素
   if(SUCCEEDED(pDoc->get_all(&pColl)))
   {
    long   nNumElements;  
    if(SUCCEEDED(pColl->get_length(&nNumElements)))
    {
     if(nNumElements)
     {
      IHTMLElement* pActiveElement=NULL;
      if(SUCCEEDED(pDoc->get_activeElement(&pActiveElement)))
      {
       //这里已获得activeElement
       long lActSrcIndex;
       pActiveElement->get_sourceIndex(&lActSrcIndex);
       for(long i=nNumElements-1;i>=0;i--)  
       {
        VARIANT varName;
        varName.vt=VT_UINT;
        varName.lVal   =   i;
        VARIANT varIndex;
        LPDISPATCH lpElementDisp=NULL;
        pColl->item(varName,varIndex,&lpElementDisp);
        {
         if(bFassCurFocus)//过了焦点,出现可焦则焦
         {
          IHTMLElement2* pElement2=NULL;   
          if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLElement2,(void**)&pElement2)))
          {
           IHTMLInputElement2*pInput=NULL;
           IHTMLAnchorElement2* pAnchor=NULL;
           IHTMLTextAreaElement* pTextArea=NULL;
           if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLInputElement2,(void**)&pInput))
            ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLAnchorElement2,(void**)&pAnchor))
            ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLTextAreaElement,(void**)&pTextArea)))
           {
            if(pInput||pAnchor||pTextArea)
            {

             if(SUCCEEDED(pElement2->focus()))
             {
              pElement2->Release();
              bFocus=TRUE;
              break;
             }
             if(pInput)
              pInput->Release();
             if(pAnchor)
              pAnchor->Release();
             if(pTextArea)
              pTextArea->Release();
            }
           }
           pElement2->Release();
          }
         }
         else
         {
          IHTMLElement* pElement=NULL;   
          if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLElement,(void**)&pElement)))
          {
           long lCurSrcIndex;
           pElement->get_sourceIndex(&lCurSrcIndex);
           if(lCurSrcIndex==lActSrcIndex)//找到当前活动元素
           {
            bFassCurFocus=TRUE;
           }
           pElement->Release();
          }
         }
        }
       }//for
       pActiveElement->Release();
      }
     }
    }
    pColl->Release();
   }
   else
    Alert("er");
   pDoc->Release();
}
lpDisp->Release();
return bFocus;
}
void CHtmlView::SetFocusToFirst(LPDISPATCH pHtmlDocument)
{
IHTMLDocument2 *pDoc=NULL;
pHtmlDocument->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if(pDoc)
{
   IHTMLElementCollection* pColl = NULL;
   //得到所有元素
   if(SUCCEEDED(pDoc->get_all(&pColl)))
   {
    long   nNumElements;  
    if(SUCCEEDED(pColl->get_length(&nNumElements)))
    {
     if(nNumElements)
     {
      for(long i = 0;i< nNumElements;i++)  
      {
       VARIANT varName;
       varName.vt=VT_UINT;
       varName.lVal   =   i;
       VARIANT varIndex;
       LPDISPATCH lpElementDisp=NULL;
       pColl->item(varName,varIndex,&lpElementDisp);
       {

        IHTMLElement2* pElement2=NULL;   
        if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLElement2,(void**)&pElement2)))
        {
         IHTMLInputElement2*pInput=NULL;
         IHTMLAnchorElement2* pAnchor=NULL;
         IHTMLTextAreaElement* pTextArea=NULL;
         if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLInputElement2,(void**)&pInput))
          ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLAnchorElement2,(void**)&pAnchor))
          ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLTextAreaElement,(void**)&pTextArea)))
         {
          if(pInput||pAnchor||pTextArea)
          {

           if(SUCCEEDED(pElement2->focus()))
           {
            pElement2->Release();
            break;
           }
           if(pInput)
            pInput->Release();
           if(pAnchor)
            pAnchor->Release();
           if(pTextArea)
            pTextArea->Release();
          }
         }
         pElement2->Release();
        }
       }
      }
     }
    }
    pColl->Release();
   }
   pDoc->Release();
}
}
////////////////////////// http://www.wzszf.com/
void CHtmlView::SetFocusToLast()
{
   LPDISPATCH lpDisp=NULL;
m_pHost->m_pWebBrowser->get_Document(&lpDisp);
IHTMLDocument2 *pDoc=NULL;
lpDisp->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc);
if(pDoc)
{
   IHTMLElementCollection* pColl = NULL;
   //得到所有元素
   if(SUCCEEDED(pDoc->get_all(&pColl)))
   {
    long   nNumElements;  
    if(SUCCEEDED(pColl->get_length(&nNumElements)))
    {
     if(nNumElements)
     {
      for(long i = nNumElements-1;i>=0;i--)  
      {
       VARIANT varName;
       varName.vt=VT_UINT;
       varName.lVal   =   i;
       VARIANT varIndex;
       LPDISPATCH lpElementDisp=NULL;
       pColl->item(varName,varIndex,&lpElementDisp);
       {

        IHTMLElement2* pElement2=NULL;   
        if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLElement2,(void**)&pElement2)))
        {
         IHTMLInputElement2*pInput=NULL;
         IHTMLAnchorElement2* pAnchor=NULL;
         IHTMLTextAreaElement* pTextArea=NULL;
         if(SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLInputElement2,(void**)&pInput))
          ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLAnchorElement2,(void**)&pAnchor))
          ||SUCCEEDED(lpElementDisp->QueryInterface(IID_IHTMLTextAreaElement,(void**)&pTextArea)))
         {
          if(pInput||pAnchor||pTextArea)
          {

           if(SUCCEEDED(pElement2->focus()))
           {
            pElement2->Release();
            break;
           }
           if(pInput)
            pInput->Release();
           if(pAnchor)
            pAnchor->Release();
           if(pTextArea)
            pTextArea->Release();
          }
         }
         pElement2->Release();
        }
       }
      }
     }
    }
    pColl->Release();
   }
   pDoc->Release();
}
lpDisp->Release();
}

理论上这个方法可以解决,事实也接近解决,当然在遇到Frame时候我碰到了极大挑战。结果,我开始重新思考解决方案。

browser-sdk:浏览器SDK Datadog浏览器SDK 浏览器SDK用于从浏览器收集日志和RUM数据。 配套 该存储库包含几个软件包: 包裹 npm 尺寸 光盘 doc 浏览器日志 浏览器RUM 浏览器RUM录音机 浏览器RUM核心 浏览器核心 立即下载

相关推荐

charles-browser-sdk:用于Charles APIJavaScript(浏览器)SDK

查尔斯浏览器SDK 用于使用CHarles API的浏览器实用程序。 用法 # Run npm install and write your library name when asked. That's all! npm install @heycharles/browser-sdk 特征 导入库 您可以导入生成的包以使用此启动程序生成的整个库: import * as charles from '@heycharles/browser-sdk' // configure which API to use. E.g. you can also run staging and sandbox APIs charles . init ( { universe : 'https://my-universe.hello-charles.com' } ) // use any authen

Internet Explorer 编程简述(十二)正确地设置和转移焦点

  关键字:焦点,Focus,加速键,Accelerator,OLEIVERB_UIACTIVATE,IHTMLWindow2,IHTMLDocument4 1、概述对于99%有UI的Windows应用程序来说,键盘操作都是不可或缺而又容易被人们遗忘的一环。如果对Windows组件作一次逐个的测试,我们会发现Microsoft提供的任何一个Windows组件都通过键盘实现完全的控制

eagleboost's blog 1万+

win32 sdk WebBrowser

一个纯Win32 SDK WebBrowser 实现的源码! 有EXE源码 DLL源码,国外的代码!相当经典!

Datadog Browser SDK 使用教程

Datadog Browser SDK 使用教程 1. 项目的目录结构及介绍 Datadog Browser SDK 是一个用于收集和发送浏览器数据到 Datadog 的开源项目。以下是项目的目录结构及主要文件介绍: browser-sdk/ ├── packages/ │ ├── browser-core/ │ ├── browser-logs/ │ ├── browser-rum/...

gitblog_00467的博客 534

泛微OA与金蝶云星空深度集成实战:审批与表单双场景解析

本文深入解析泛微OA与金蝶云星空的深度集成实战,聚焦审批流程与表单对接两大核心场景。通过具体案例,详细阐述了如何实现业务数据与审批流程的自动联动,打破数据孤岛,提升企业运营效率与数据一致性,并分享了接口设计、安全策略及实战避坑指南。

4k5l6j7h8的博客 467

华为鸿蒙系统也能用!5分钟搞定谷歌三件套安装(附最新APK下载链接)

本文为华为鸿蒙系统用户提供了一份详尽的谷歌三件套(Google Play服务、商店及框架)手动安装指南。文章核心在于无需Root,通过ADB命令获取设备信息,并从可靠来源下载匹配版本的APK,按照正确顺序安装,从而解决海外应用依赖问题,实现5分钟快速部署。

c7d8e9的博客 6543

java/.net跨平台UI浏览器SDK,浏览器控件开发包分析

场景推荐方案理由企业级跨平台应用JxBrowser功能完整,技术支持完善,适合商业项目开源项目或预算有限JCEF完全开源,适合深度定制轻量级嵌入式设备WebKitGTK体积小,依赖少,适合资源受限环境旧版 Web 标准支持JRex支持 HTML4/CSS2,适合遗留系统迁移部署建议生产环境优先选择 JxBrowser 或 JCEF,确保 Chromium 版本更新至最新安全补丁。开发阶段使用 Docker 容器化部署,避免依赖冲突。

950

C# 实现鼠标轨迹录制与回放自动化功能(附源码)

通过本文的介绍,相信大家已经掌握了鼠标轨迹录制与回放功能的实现方式。该功能在自动化测试和重复性工作中具有重要应用价值。后续可以进一步优化,增加更多扩展功能,形成一个完整的自动化工具。

weixin_72139050的博客 1756

阿里云oss浏览器开发(Browser-JS-SDK )实现多文件上传并监测上传进度

        应公司需求实现云空间多文件上传功能,后台接口为JAVA开发。        先开始采用直接调用后台给的接口实现多文件上传功能,发现jqery封装的上传进度监测并不准确,而且文件上传文件速度过慢,用过很多方法都没有实现想要的效果。        后来改用阿里云oss对象存储来实现多文件上传功能并监测上传进度的功能:        首先,引入js文件,这是必不可少的&lt;script...

dream_halo的博客 8017

PX4 Offboard模式实战避坑:为什么你的Gazebo无人机解锁了却飞不起来?

本文深入解析PX4 Offboard模式下Gazebo无人机解锁后无法起飞的关键原因,提供详细的故障排查流程和调试方法。重点解决MAVROS连接、setpoint消息频率、坐标系一致性等常见问题,帮助开发者快速掌握无人机控制核心技术。

weixin_33461476的博客 328

使用Python实现深度学习模型:智能极端天气事件预测

在本项目中,我们成功利用Python和Keras库构建了一个基于LSTM的极端天气预测模型。通过时间序列数据,模型能够识别天气趋势并预测未来的极端天气事件。尽管这是一个简化的示例,但它为实际应用中如何利用深度学习进行天气预测提供了一个很好的基础。随着更精确的数据和更多的特征信息,类似的模型可以进一步扩展到其他极端事件预测上,如风暴预警、气象灾害评估等。

Echo_Wish 730

使用C++实现SDK之WebBrowser容器 系列的一个补充. 关于GetHtmlDocumentX()

之前的文章 "http://blog.youkuaiyun.com/norsd/archive/2008/09/13/2921389.aspx" 实现了一个WebBrowser.   但是万物总不是完美的, 最近有网友问, GetHTMLDocumentX 系列函数的实现,是否需要Release.   当时我回答不需要. 我是这样考虑的:   WebBrowser 类只提供一个(系列)  IHtm

achellies's Blog 1313

深度解析与实战:长短时记忆网络(LSTM)在股票走势预测中的应用(基于Python + PyTorch)

本文全面探讨了LSTM在股票价格预测中的应用,从理论基础到实践操作。文章首先强调了股票市场预测的重要性,并介绍了LSTM网络结构及其在处理时间序列数据中的优势。接着,详细说明了数据预处理的关键步骤,包括数据收集、清洗、特征选择和归一化。文章还讨论了LSTM模型的构建、训练和评估,并提供了Python及PyTorch的实操案例。最后,总结了LSTM在股票预测的成果,并提出了未来研究的方向,如模型优化和特征工程,旨在帮助读者掌握LSTM在股票价格预测中的应用,并探索提升模型性能的方法。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2105

使用C++实现SDK之WebBrowser容器 系列的一个补充. 关于GetHtmlDocumentX()

之前的文章 "http://blog.youkuaiyun.com/norsd/archive/2008/09/13/2921389.aspx" 实现了一个WebBrowser. 但是万物总不是完美的, 最近有网友问, GetHTMLDocumentX 系列函数的实现,是否需要Release. 当时我回答不需要. 我是这样考虑的: WebBrowser 类只提供一个(系列)  IHtm

norsd的专栏 4065

UG NX二次开发(C#)--详细讲述编程模板NXOpen_CS_Wizard的代码意义,帮你轻松进入NXOpen(C#)二次开发

有几个读者私信问我,在看了“NX1957在VS2019上二次开发的环境配置”后,能完成了UG NX二次开发(C#)模板的配置,也能根据模板创建工程,但是对工程文件.cs不甚理解;并且,在UG Styler新建完成后,其也有一个dlx文件和.cs文件,也不清楚怎么使用。本文先对UG NX二次开发(C#)模板文件进行讲解,在下一个博客中,讲解Styler新建后的模板文件。以上就是对编程模板NXOpen_CS_Wizard(c#)的讲解,其实只要明白了逻辑关系,编程实现只是时间问题,祝你好运。

GimiGimmy 1786

Vulkan入门系列3 - 绘制三角形代码解析(全)

【代码】Vulkan入门系列3 - 绘制三角形完整代码(带详细注释)

GPU全栈博主 1035

告别WebBrowser!在WPF里用WebView2做个现代化浏览器(.NET 6 + Edge Chromium)

本文详细介绍了如何在WPF应用中从老旧的WebBrowser迁移到现代化的WebView2控件,基于.NET 6和Edge Chromium内核,提升浏览器功能的兼容性、性能和安全性。通过实战代码示例,展示了WebView2的初始化、导航控制、JavaScript互操作等核心功能,帮助开发者快速实现高效、现代的浏览器集成方案。

432

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

浏览器自动化的一些体会8 访问angular页面的一个问题

发现浏览器自动化有一个重要方面没有提及,即所谓的无页面浏览器,不过最近没有需求,不想尝试,先记上一笔,以后有需求时,可以有个思路。 大约一两个月前(现在比较懒散,时间不知不觉过去,连今天是几号有时候都搞糊涂),碰到一个问题,本来程序中用WebBrowser控件访问一个页面,现在那个页面用Angular重写了,访问出错,出来一个空白页面。 1。解决方案一是改注册表,修改webBrowser控件所...

weixin_30500289的博客 235

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C#关于抓包网站解析】webBrowser实现自动登录以及淘宝登录部分登录找不到对应控件解决方法

最近在开发一款淘宝领券机器人,其中要应用到网络抓包程序,使用C#开发,进行模拟自动登录,但是发现一个问题淘宝自动登录老是找不到对应的控件Id,最后想可能是淘宝应用啥技术隐藏了对应Id,借此机会教大家一些技巧。 使用遍历标签来找到id if (webBrowser1.Document.GetElementsByTagName("input").Count > 0) { ...

谢先生的日记 1737

QQ微博登陆封装

最近想搞写一个基于QQ微博的桌面应用,按照官方的介绍,我使用C#的SDK进行开发,但是发现这个SDK关于登陆的地方很粗糙,另外发现通过OAuth的方式登陆的话,需要用户去填写获取到的verifer字符串。 研究了一下,发现C#里面可以通过一个Webbrowser来解决这个问题。基于这个机制,我写了一个登陆的辅助类。 using System; using System.Collectio...

weixin_34092370的博客 85

urlmon.idl

【代码】urlmon.idl。

zslefour的专栏 153

Windows phone 应用开发系列教程(更新中)

Windows phone 应用开发[1]-Text To Speech        作为开篇章节.第一篇将在如下介绍一些Windows phone比较有意思的东西-Text To Speech[文本到语音转换]. 相信大家最近一定对IPhone 4S 的Siri影响深刻.其实作为智能Smart Phone一个终极标准之一就是实现人类语言和...

weixin_33805557的博客 347

winform与IE交互

先声明不是我写的,不过其思想是可借鉴的,有时间我写个基于SDK 的代码,最近很忙 ! WebBrowser页面与WinForm交互技巧 话说有了WebBrowser类,终于不用自己手动封装SHDocVw的AxWebBrowser这个ActiveX控件了。这个类如果仅仅作为一个和IE一模一样浏览器,那就太没意思了(还不如直接用IE呢)。那么,无论我们是想做一个“定制版IE”,还是希望利用HTML来做...

weixin_30478923的博客 145
上一篇: Html 进行DOM 操作(放缩,颜色...),HTML抓图(放缩,滚动,拼接)
下一篇: 最近在SDK下使用WebBrowser遇到了个问题
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值