Получение координат щелчка мыши в приложении CLR, использующем пакет CefSharp Nuget

#mfc #clr #cefsharp #chromium-embedded

#mfc #clr #cefsharp #встроенный в chromium

Вопрос:

Я хочу получить координаты места, где пользователь нажимает на страницу.В принципе, я хочу событие мыши на странице ChromiumWebBrowser.

Я создаю браузерное приложение, производное от MFC MDI CView, которое использует ссылку на CLR. Для этого я перешел по ссылке https://www.youtube.com/watch?v=uBvDK6LE4XM.

Я использую пакеты nuget cef.redist.x86 (3.3325.1758),cef.redist.x64 (3.3325.1758), CefSharp.Общий (65.0.0-pre01), CefSharp.WinForms(65.0.0-pre01).

Реализация имеет toolstripcontainer, и я загружаю свой браузер следующим образом:

 ChromiumWebBrowser^ browser;
browser= gcnew ChromiumWebBrowser();
browser->Load("http://google.com");
this->CefToolStripContainer->ContentPanel->Controls->Add(browser);
browser->Dock = DockStyle::Fill;
this->AddressToolStripTextBox->Text = "http://google.com";
  

Я могу получать события, подобные OnFrameLoadEnd. Но когда я пытаюсь получить событие щелчка мыши, ничего не происходит, когда я делаю это

 this->browser->Click  = gcnew System::EventHandler(this, amp;clr_cefbrowser::CefBrowserCtrl::OnClick);
  

Событие щелчка запускается для других элементов управления, которые я добавляю (после удаления браузера из contentpanel), но не для браузера.
Ниже приведен полный код для реализации.

 #pragma once

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

using namespace CefSharp;
using namespace CefSharp::WinForms;
using namespace System::Threading::Tasks;
using namespace System::Runtime::InteropServices;

#include <vector>


namespace clr_cefbrowser {

    /// <summary>
    /// Summary for CefBrowserCtrl
    /// </summary>
    public ref class CefBrowserCtrl : public System::Windows::Forms::UserControl
    {
    public:
        CefBrowserCtrl(void)
        {
            InitializeComponent();
            InitBrowser();
        }

    private:
        ChromiumWebBrowser^ browser;

    public:
        void InitBrowser()
        {
            browser = gcnew ChromiumWebBrowser();
            browser->Load("http://google.com");
            this->CefToolStripContainer->ContentPanel
                ->Controls->Add(browser);
            browser->Dock = DockStyle::Fill;
            this->AddressToolStripTextBox->Text = "http://google.com";
            this->browser->Click  = gcnew System::EventHandler(this, 
                                                           amp;clr_cefbrowser::CefBrowserCtrl::OnClick);
        }

    protected:
        ~CefBrowserCtrl()
        {
            if (components)
            {
                delete components;
            }
        }
    private: System::Windows::Forms::ToolStripContainer^  CefToolStripContainer;
    private: System::Windows::Forms::ToolStrip^  CefToolStrip;
    private: System::Windows::Forms::ToolStripLabel^  toolStripLabel1;
    private: System::Windows::Forms::ToolStripTextBox^  AddressToolStripTextBox;
    private: System::Windows::Forms::ToolStripButton^  GoToolStripButton;
    protected:

    private:
        /// <summary>
        /// Required designer variable.
        /// </summary>
        System::ComponentModel::Container ^components;

   #pragma region Windows Form Designer generated code
   void InitializeComponent(void)
   {
      System::ComponentModel::ComponentResourceManager^  resources = (gcnew 
      System::ComponentModel::ComponentResourceManager(CefBrowserCtrl::typeid));
      this->CefToolStripContainer = (gcnew System::Windows::Forms::ToolStripContainer());
      this->CefToolStrip = (gcnew System::Windows::Forms::ToolStrip());
      this->toolStripLabel1 = (gcnew System::Windows::Forms::ToolStripLabel());
      this->AddressToolStripTextBox = (gcnew System::Windows::Forms::ToolStripTextBox());
      this->GoToolStripButton = (gcnew System::Windows::Forms::ToolStripButton());
      this->CefToolStripContainer->TopToolStripPanel->SuspendLayout();
      this->CefToolStripContainer->SuspendLayout();
      this->CefToolStrip->SuspendLayout();
      this->SuspendLayout();
      // 
      // CefToolStripContainer
      // 
      // 
      // CefToolStripContainer.ContentPanel
      // 
      this->CefToolStripContainer->ContentPanel->Size = System::Drawing::Size(476, 265);
      this->CefToolStripContainer->Dock = System::Windows::Forms::DockStyle::Fill;
      this->CefToolStripContainer->Location = System::Drawing::Point(0, 0);
      this->CefToolStripContainer->Name = L"CefToolStripContainer";
      this->CefToolStripContainer->Size = System::Drawing::Size(476, 290);
      this->CefToolStripContainer->TabIndex = 0;
      this->CefToolStripContainer->Text = L"toolStripContainer1";
      // 
      // CefToolStripContainer.TopToolStripPanel
      // 
      this->CefToolStripContainer->TopToolStripPanel->Controls->Add(this->CefToolStrip);
     // 
     // CefToolStrip
     // 
     this->CefToolStrip->Dock = System::Windows::Forms::DockStyle::None;
     this->CefToolStrip->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^  >(3) {
    this->toolStripLabel1,
        this->AddressToolStripTextBox, this->GoToolStripButton
    });
    this->CefToolStrip->Location = System::Drawing::Point(3, 0);
    this->CefToolStrip->Name = L"CefToolStrip";
    this->CefToolStrip->Size = System::Drawing::Size(337, 25);
    this->CefToolStrip->TabIndex = 0;
    // 
    // toolStripLabel1
    // 
    this->toolStripLabel1->Name = L"toolStripLabel1";
    this->toolStripLabel1->Size = System::Drawing::Size(31, 22);
    this->toolStripLabel1->Text = L"URL:";
    // 
    // AddressToolStripTextBox
    // 
    this->AddressToolStripTextBox->Name = L"AddressToolStripTextBox";
    this->AddressToolStripTextBox->Size = System::Drawing::Size(250, 25);
    // 
    // GoToolStripButton
    // 
    this->GoToolStripButton->Image = (cli::safe_cast<System::Drawing::Image^>(resources- 
    >GetObject(L"GoToolStripButton.Image")));
    this->GoToolStripButton->ImageTransparentColor = System::Drawing::Color::Magenta;
    this->GoToolStripButton->Name = L"GoToolStripButton";
    this->GoToolStripButton->Size = System::Drawing::Size(42, 22);
    this->GoToolStripButton->Text = L"Go";
    this->GoToolStripButton->Click  = gcnew System::EventHandler(this, 
    amp;CefBrowserCtrl::GoToolStripButton_Click);
    // 
    // CefBrowserCtrl
    // 
    this->AutoScaleDimensions = System::Drawing::SizeF(7, 12);
    this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    this->Controls->Add(this->CefToolStripContainer);
    this->DoubleBuffered = true;
    this->Name = L"CefBrowserCtrl";
    this->Size = System::Drawing::Size(476, 290);
    this->CefToolStripContainer->TopToolStripPanel->ResumeLayout(false);
    this->CefToolStripContainer->TopToolStripPanel->PerformLayout();
    this->CefToolStripContainer->ResumeLayout(false);
    this->CefToolStripContainer->PerformLayout();
    this->CefToolStrip->ResumeLayout(false);
    this->CefToolStrip->PerformLayout();
    this->ResumeLayout(false);
  

}

 #pragma endregion
  public:
    ClrChromiumWebBrowser^ GetBrowser()
    {
        return this->browser;
    }
    
  private:          
    void OnClick(System::Object ^sender, System::EventArgs ^e);
  

};
}

 void clr_cefbrowser::CefBrowserCtrl::OnClick(System::Object ^sender, System::EventArgs ^e)
{
    MessageBox::Show("Click Event");
}
  

И в моем классе просмотра у меня есть

 CWinFormsControl<clr_cefbrowser::CefBrowserCtrl> m_CefBrowser;
  

И я получаю событие frameloadend с помощью BEGIN_DELEGATE_MAP и MAKE_DELEGATE.
Я действительно не уверен, как действовать дальше.

Комментарии:

1. Chromium обрабатывает / проглатывает все события мыши, поэтому поддержка событий мыши отсутствует. Что именно вы хотите сделать щелчком мыши? Часто проще ввести какой-нибудь javascript. Версии 65.0.0-pre01 уже много лет и она не поддерживается.

2. Привет, амайтланд, у меня есть глобус (cesium), который загружен на страницу. пользователь должен иметь возможность добавить элемент на глобусе, например станцию (или любой объект), для которого ему нужны координаты. Координаты выбираются, когда пользователь нажимает на определенную область на глобусе (в любом месте, которое он пожелает). Как мне следует подойти к этой проблеме?

3. Видишь github.com/cefsharp/CefSharp/wiki /… для внедрения JavaScript для получения базового щелчка. Вам необходимо будет перейти на поддерживаемую версию, чтобы использовать этот метод. В противном случае вам придется подключить низкоуровневый hwnd для получения сообщений, см. github.com/cefsharp/CefSharp/blob/cefsharp/84 /… для грубого примера.

4. Привет, я могу передать сообщение в свою форму, но когда я использую cesium.com/cesiumjs/cesium-viewer/index.html?..I не получает никаких щелчков. Также, когда я пытаюсь загрузить это из моей winform, браузер зависает. Можете ли вы помочь мне с этим.

5. Я бы предложил использовать JavaScript, это мой предпочтительный выбор.