zoukankan      html  css  js  c++  java
  • 基于OpenCV的视频图像组态 (11): CEF浏览器与C++通信

    取得页面源码

    CEF按事件来处理,有点麻烦。总共分以下几步:

    • TChromium->OnLoadEnd事件中检测frame->IsMain(),来判断页面是否已完全载入
    • 然后调用TChromium->RetrieveHTML
    • 要在TChromium->OnTextResultAvailable事件中取得源码

     

    自己处理一下

     

    void __fastcall TCbwChromiumExplorer::LoadURL(UnicodeString url) {

        FUrl = url;

        FChromium->LoadURL(url);

        FStatus = CBW_CHROMIUM_STAGE_BEGIN_LOAD;

    }

     

    void __fastcall TCbwChromiumExplorer::OnLoadEnd(System::TObject* Sender,

        const Ucefinterfaces::_di_ICefBrowser browser,

        const Ucefinterfaces::_di_ICefFrame frame, int httpStatusCode) {

        if(frame->IsMain()) {

            FStatus = CBW_CHROMIUM_STAGE_MAINCOMPLETE;

            FChromium->RetrieveHTML();

            FStatus = CBW_CHROMIUM_STAGE_BEGIN_GETSOURCE;

        }

    }

     

    void __fastcall TCbwChromiumExplorer::OnTextResultAvailable(System::TObject* Sender, const System::UnicodeString aText) {

        if(CBW_CHROMIUM_STAGE_BEGIN_GETSOURCE == FStatus) {

            FSourceCode = aText;

    FStatus = CBW_CHROMIUM_STAGE_END_GETSOURCE;

        }

    }

     

    顺便判断一下是否取得了网页

    bool __fastcall TCbwChromiumExplorer::GetIsBlank() {

        while(FStatus != CBW_CHROMIUM_STAGE_MAINCOMPLETE && FStatus != CBW_CHROMIUM_STAGE_END_GETSOURCE)

            THelper::Util::Delay(100);

        if(FSourceCode.Length() < 40)

            return true;

        return false;

    }

    采用FSourceCode.Length()<40来判断的原因是:如果载入空白,则源码为<html><head></head><body></body></html>,数了一下,字符数目为39。

     

    最后,在调用的时候是这样样的

        GlobalChromiumExplorer->LoadURL(CbwOptionForm->LabeledEdit_StartPage->Text);

        if(GlobalChromiumExplorer->IsBlank)

            GlobalChromiumExplorer->LoadURL(CbwOptionForm->LabeledEdit_StartPage->Text);

     

    当然,还可以更进一步,直接在LoadURL中进行检测,即可简单实现。

     

    JavaSript à C++

    在网上找了一下,就一种方法:

    参考DELPHI的写法,改造成下面的样子。

    class TCbwJS2C : public TObject {

    public:

        static UnicodeString __fastcall Request();

    };

     

    class TCustomRenderProcessHandler : public TCefRenderProcessHandlerOwn {

    public:

        virtual void __fastcall OnWebKitInitialized();

    };

     

    UnicodeString __fastcall TCbwJS2C::Request() {

    ShowMessage("Call TCbwJS2C::Request");

    }

     

    void TCustomRenderProcessHandler::OnWebKitInitialized() {

    TCefRTTIExtension::Register("JS_DRGRAPH", TCbwJS2C);

    }

    稍微处理一下,得到期望结果。

  • 相关阅读:
    命令行界面下用户和组管理之groupadd的使用
    vue数据更新UI不刷新显示解决方案
    传入函数作为string.replace方法的第二个参数应用
    CSS 黑魔法-css控制图标颜色
    谈谈Web Components
    js函数组合
    “平滑滚动”效果骚操作
    BFC布局解析
    关于js构造函数return的一些解惑
    关于setTimeout和setInterval你不知道的事
  • 原文地址:https://www.cnblogs.com/drgraph/p/8027723.html
Copyright © 2011-2022 走看看