基于OpenCV的视频图像组态 (11): CEF浏览器与C++通讯

取得页面源码 html

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

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

 

本身处理一下 spa

 

void __fastcall TCbwChromiumExplorer::LoadURL(UnicodeString url) { code

    FUrl = url; orm

    FChromium->LoadURL(url); htm

    FStatus = CBW_CHROMIUM_STAGE_BEGIN_LOAD; blog

} 事件

 

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

    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);

}

稍微处理一下,获得指望结果。

相关文章
相关标签/搜索