Добавить пользовательский обработчик windows.postMessage

На веб-кнопке есть кнопка, которая выполняет JS windows.postmessage и отправляет некоторые данные. В C# bho я хочу захватить эти данные и вызвать какую-нибудь локальную службу. Мне нужны подсказки, как это сделать.

  1. Можем ли мы напрямую обработать это событие сообщения в C#? Как бы это было?
  2. Можем ли мы вызвать метод BHO из javascript. Таким образом, мы можем внедрить этот обработчик событий на веб-страницу, которая вызовет функцию bho. Это что-то, если мы не можем захватить событие сообщения Windows post в C#.

person Jackie    schedule 20.09.2013    source источник


Ответы (1)


  1. Вы не можете напрямую работать с функцией java-скрипта из C#. Однако вы можете перехватить вызов нажатия кнопки и выполнить часть своего кода.
  2. Да, вам нужно опубликовать свой собственный COM-объект на странице. Затем внедренные скрипты могут использовать этот объект для обратного вызова BHO. Не уверен, как именно это сделать с C #, хотя примеров кода не существует. Пример функции C++ для внедрения COM-объекта приведен ниже, надеюсь, это поможет

.

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;
}
person Andrey    schedule 20.09.2013
comment
Я имею в виду, что мне нужен обработчик событий в C # BHO для события postmessage javascript. - person Jackie; 20.09.2013
comment
Попробуйте прослушать событие message для целевого кадра - person Andrey; 20.09.2013
comment
DHTMLEventHandler Handler = new DHTMLEventHandler((IHTMLDocument2)webBrowser.Document); Handler.Handler += new DHTMLEvent(Logo_OnClick); htmlElement.onclick = Handler; Это работает для события щелчка элемента. Мне нужно что-то подобное, но для события window.postMessage(data). - person Jackie; 21.09.2013
comment
Насколько я понимаю, postMessage запускает событие message в целевом кадре. вы можете использовать интерфейс IHTMLWindowEvents3 для подключения вашего обработчика: msdn .microsoft.com/en-us/library/cc849050(v=vs.85).aspx - person Andrey; 22.09.2013