Как в Borland C++ Builder 6 по событию внутри компонента CWebBrowser1 запустить событие в коде C++

Гобелен - кликните для возврата на главную

Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.

Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.

Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.

Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.

На очередном конкурсе танцев, школьница отлично выступила.

Что использовать вместо Юбуст

Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.

Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.

Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!

104 549 руб.

Описание товара

Предположим что у меня в CWebBrowser загружена некоторая страница у которой есть некоторый элемент при клике по которому требуется чтобы были выполнены некоторые действия, например пусть Label1 будет присвоен какой то текст. Как это сделать? Взаимодействие между страницей в TWebBrowser и кодом C++ Builder 6

Для обработки кликов по элементам веб-страницы и выполнения действий в приложении (например, изменения Label1->Caption) нужно:

Подготовка HTML-страницы

Добавьте обработчик клика в ваш HTML-элемент:

HTML
    
<button onclick="window.external.OnButtonClick('параметр')">Нажми меня</button>

  

Реализация IDispatch интерфейса (в вашем проекте C++ Builder)

Создайте класс для обработки событий:

C++
    
// В заголовочном файле (например, WebBrowserEventHandler.h)
class TWebBrowserEventHandler : public TObject, public IDispatch
{
public:
    // IDispatch methods
    STDMETHOD(GetTypeInfoCount)(unsigned int* pctinfo) { return E_NOTIMPL; }
    STDMETHOD(GetTypeInfo)(unsigned int iTInfo, LCID lcid, ITypeInfo** ppTInfo) { return E_NOTIMPL; }
    STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR* rgszNames, unsigned int cNames, LCID lcid, DISPID* rgDispId) 
    {
        if (cNames == 1 && wcscmp(rgszNames[0], L"OnButtonClick") == 0)
        {
            *rgDispId = 1;
            return S_OK;
        }
        return DISP_E_UNKNOWNNAME;
    }
    
    STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
                      DISPPARAMS* pDispParams, VARIANT* pVarResult, EXCEPINFO* pExcepInfo, unsigned int* puArgErr)
    {
        if (dispIdMember == 1) // OnButtonClick
        {
            if (pDispParams->cArgs > 0 && pDispParams->rgvarg[0].vt == VT_BSTR)
            {
                WideString param = pDispParams->rgvarg[0].bstrVal;
                Form1->Label1->Caption = "Получен параметр: " + param;
            }
            return S_OK;
        }
        return DISP_E_MEMBERNOTFOUND;
    }
    
    // IUnknown methods
    STDMETHOD_(ULONG, AddRef)() { return 1; }
    STDMETHOD_(ULONG, Release)() { return 1; }
    STDMETHOD(QueryInterface)(REFIID riid, void** ppv)
    {
        if (riid == IID_IDispatch || riid == IID_IUnknown)
        {
            *ppv = static_cast<IDispatch*>(this);
            return S_OK;
        }
        return E_NOINTERFACE;
    }
};

  

Подключите обработчик к WebBrowser:

C++
    
// В Unit1.cpp
TWebBrowserEventHandler* handler;
      
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    handler = new TWebBrowserEventHandler();
    CppWebBrowser1->RegisterAsBrowser = true;
    
    // Получаем интерфейс документа
    IWebBrowser2* wb = CppWebBrowser1->DefaultInterface;
    IDispatchPtr docDispatch = wb->GetDocument();
    
    // Устанавливаем наш обработчик
    IDispatchEx* docEx;
    if (docDispatch->QueryInterface(IID_IDispatchEx, (void**)&docEx) == S_OK)
    {
        docEx->SetPropertyByName(L"external", (VARIANT*)&handler);
        docEx->Release();
    }
}

  

Альтернативный способ (через JavaScript и COM)

Если предыдущий метод сложен, можно использовать более простой подход.

HTML
    
<button onclick="window.external.SetLabelText('Новый текст')">Обновить Label</button>

  
C++
    
// Объявите в классе формы:
TComObjectFactory* factory;
      
// В FormCreate:
factory = new TComObjectFactory(CLSID_NULL, __classid(TForm1), "", "", 
                               OLEMISC_SIMPLEFRAME|OLEMISC_ACTSLIKELABEL,
                               tmApartment);
      
// Добавьте метод в класс формы:
STDMETHODIMP TForm1::SetLabelText(BSTR text)
{
    Label1->Caption = WideString(text);
    return S_OK;
}

  

Самый простой способ (если страница ваша)

Используйте Navigate с javascript:

C++
    
// В обработчике события нажатия кнопки:
CppWebBrowser1->Navigate("javascript:window.external.SetLabelText('Текст')");

  

Важные замечания

Для работы window.external необходимо установить RegisterAsBrowser = true.

В IE6 могут быть ограничения безопасности - убедитесь что страница загружена из доверенной зоны.

Для сложных взаимодействий лучше использовать IOleCommandTarget интерфейс.

Выберите подход в зависимости от сложности вашей задачи. Первый вариант наиболее универсален, последний - самый простой для быстрой реализации.

Другие товары

Вы так же можете прочитать следующие статьи: