添加自定义windows.postMessage处理程序

时间:2013-09-20 06:17:12

标签: c# events bho postmessage

在web按钮上有一个按钮执行JS windows.postmessage并发送一些数据。在C#bho 我想捕获这些数据并调用一些本地服务。我需要有关如何做到这一点的线索。

  1. 我们可以在C#中直接处理此消息事件吗?怎么会这样?
  2. 我们可以从javascript调用BHO方法吗?所以我们可以在网页中注入这个事件处理程序,它将调用bho函数。如果我们无法在C#中捕获Windows post消息事件,那就是这种情况。

1 个答案:

答案 0 :(得分:0)

  1. 您不能直接使用C#的java脚本函数。但是,您可以拦截按钮单击调用并执行一些代码
  2. 是的,您需要将自己的COM对象发布到页面。然后注入的脚本可以使用此对象来回叫BHO。不知道如何使用C#完全实现它,但不存在代码示例。注入COM对象的C ++示例函数如下,希望有所帮助
  3. HRESULT AddProperty(SHDocVw::IWebBrowser2* pBrowser, _bstr_t bstrName, _variant_t varValue)
    {
        CComQIPtr<IHTMLDocument> spDoc = pBrowser->Document;
        CComPtr<IDispatch> spScript;
        spDoc->get_Script(&spScript);
    
        _variant_t varResult;
        HRESULT hr = spScript.GetPropertyByName(OLESTR("window"), varResult.GetAddress());
        CComQIPtr<IDispatchEx> spScriptEx = varResult;
    
        DISPID id;
        hr = spScriptEx->GetDispID(bstrName), fdexNameEnsure, &id);
        if (SUCCEEDED(hr))
        {
            DISPID propid = DISPID_PROPERTYPUT;
            DISPPARAMS dp = {NULL, NULL, 1, 1};
            dp.rgdispidNamedArgs = &propid;
            dp.rgvarg = &varValue;
    
            hr = spScriptEx->InvokeEx(id, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dp, NULL, NULL, NULL);
        }
        return hr;
    }