2

WindowsアプリにWebkitブラウザコントロールを実装しています。

どの要素が右クリックされたかに関係なく、オプションとしてコピー/カット/貼り付けのみを持つカスタムコンテキストメニュー(右クリック)を使用する必要があります。それをどのように実装するかについて、段階的に説明する必要があります

4

1 に答える 1

1

のコンテキストメニューをカスタマイズするWebKitBrowserことは、への参照を取得し、メソッドを呼び出してそのためのをWebViewClass設定することを前提としています。IWebUIDelegatesetUIDelegate()

void MyWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var webView = this.GetWebView() as WebKit.Interop.WebViewClass;
    webView.setUIDelegate(new MyWebUIDelegate(this));
}

実装ではIWebUIDelegate、メソッドをインターセプトしてcontextMenuItemsForElement、ブラウザのコンテキストメニューの表示をトリガーできます。

作業サンプルは次のとおりです。

public partial class Form1 : Form
{
    MyWebBrowser webKitBrowser;

    public Form1()
    {
        InitializeComponent();
        webKitBrowser = new MyWebBrowser();
        webKitBrowser.Dock = DockStyle.Fill;
        this.Controls.Add(webKitBrowser);
        webKitBrowser.Navigate("http://www.google.com");
    }
}

class MyContextMenu : ContextMenu
{
    public MyContextMenu()
    {
        var cutMenuItem = new MenuItem("Cut");
        var copyMenuItem = new MenuItem("Copy");
        var pasteMenuItem = new MenuItem("Paste");

        cutMenuItem.Click += cutMenuItem_Click;

        MenuItems.Add(cutMenuItem);
        MenuItems.Add(copyMenuItem);
        MenuItems.Add(pasteMenuItem);
    }

    void cutMenuItem_Click(object sender, EventArgs e)
    {
        //TODO: implement functionality
        MessageBox.Show("Cut was selected");
    }
}

class MyWebBrowser : WebKitBrowser
{

    public event EventHandler ShowContextMenu = new EventHandler(OnFireShowContextMenu);

    public MyWebBrowser()
    {
        DocumentCompleted += MyWebBrowser_DocumentCompleted;
        var myContextMenu = new MyContextMenu();
        ContextMenu = myContextMenu;
    }

    void MyWebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        var webView = this.GetWebView() as WebKit.Interop.WebViewClass;
        webView.setUIDelegate(new MyWebUIDelegate(this));
    }

    public static void OnFireShowContextMenu(object sender, EventArgs e)
    {
        var webBrowser = (Control)sender;
        var webView = (WebKit.Interop.WebViewClass)((MyWebBrowser)sender).GetWebView();
        var originalPoint = webBrowser.PointToScreen(new Point(0, 0));
        var currentPoint = new Point(Cursor.Position.X - originalPoint.X, Cursor.Position.Y - originalPoint.Y);

        ((WebKitBrowser)sender).ContextMenu.Show((Control)sender, currentPoint);
    }

    public void FireShowContextMenu()
    {
        this.ShowContextMenu(this, null);
    }

}

class MyWebUIDelegate : IWebUIDelegate
{
    private MyWebBrowser owner;

    public MyWebUIDelegate(MyWebBrowser browser)
    {
        this.owner = browser;
    }

    //trigger the browser's FireShowContextMenu() method
    public int contextMenuItemsForElement(WebView sender, CFDictionaryPropertyBag element, int defaultItemsHMenu)
    {
        owner.FireShowContextMenu();
        return defaultItemsHMenu;
    }

    //return 1, true
    public int hasCustomMenuImplementation()
    {
        return 1;
    }

    //the rest of the IWebUIDelegate interface implementation
}

詳細については、open-webkit-sharpなどの他のカスタマイズを検討することをお勧めします。

于 2013-01-27T15:57:40.240 に答える