C# CefSharp:ChromiumWebBrowser中是否有左键单击处理程序?

C# CefSharp:ChromiumWebBrowser中是否有左键单击处理程序?,c#,.net,chromium,cefsharp,C#,.net,Chromium,Cefsharp,我正在尝试禁用ChromiumWebBrowser webview中的任何单击活动(无论是左键单击还是右键单击)。到目前为止,我可以通过IContextMenuHandler的OnContextMenuDismissed来处理右键单击部分,它工作得非常完美,但我似乎无法找到左键单击部分的解决方案。你知道吗?我对CefSharp还是新手,任何帮助或任何能启发我的人都可以。谢谢 您可以使用javascript处理click事件,如果您需要C#code中的任何内容,则创建回调对象并使用Register

我正在尝试禁用ChromiumWebBrowser webview中的任何单击活动(无论是左键单击还是右键单击)。到目前为止,我可以通过IContextMenuHandler的OnContextMenuDismissed来处理右键单击部分,它工作得非常完美,但我似乎无法找到左键单击部分的解决方案。你知道吗?我对CefSharp还是新手,任何帮助或任何能启发我的人都可以。谢谢

您可以使用javascript处理click事件,如果您需要C#code中的任何内容,则创建回调对象并使用
RegisterJsObject
注册它。然后在js代码中,您可以引用回调对象

在下面的示例中,我浏览了google并动态地将
click
事件处理程序附加到所有
a
标记上。然后,当点击
a
标记时,我已经使用
CallbackObject
bool a\u click(string)
方法处理了点击

然后我检查了链接是否不是gmail链接,它将停止浏览:

public class CallbackObjectForJs {
    public bool handleAClick(string url) {
        if (!url.ToLower().StartsWith("https://mail.google.com"))
            return true; //cancel event
        else
            return false;
    }
}

ChromiumWebBrowser browser;
protected override void OnLoad(EventArgs e) {
    base.OnLoad(e);
    CefSharpSettings.LegacyJavascriptBindingEnabled = true;
    browser = new ChromiumWebBrowser(
        "https://www.google.com");
    browser.RegisterJsObject("callbackObj", new CallbackObjectForJs());
    browser.LoadingStateChanged += Browser_LoadingStateChanged;
    browser.Dock = DockStyle.Fill;
    Controls.Add(browser);
}

private void Browser_LoadingStateChanged(object sender,
    LoadingStateChangedEventArgs e) {
    if (!e.IsLoading) {
        var script = @"
            var data = document.getElementsByTagName('a');
            Array.from(data).forEach((a) => {
                a.addEventListener('click', function(e){
                    if(callbackObj.handleAClick(this.href)) {
                        e.preventDefault();
                    }
                });
            });";
        browser.ExecuteScriptAsync(script);
    }
}

您可以使用javascript处理click事件,如果您需要C#code中的任何内容,则创建回调对象并使用
RegisterJsObject
注册它。然后在js代码中,您可以引用回调对象

在下面的示例中,我浏览了google并动态地将
click
事件处理程序附加到所有
a
标记上。然后,当点击
a
标记时,我已经使用
CallbackObject
bool a\u click(string)
方法处理了点击

然后我检查了链接是否不是gmail链接,它将停止浏览:

public class CallbackObjectForJs {
    public bool handleAClick(string url) {
        if (!url.ToLower().StartsWith("https://mail.google.com"))
            return true; //cancel event
        else
            return false;
    }
}

ChromiumWebBrowser browser;
protected override void OnLoad(EventArgs e) {
    base.OnLoad(e);
    CefSharpSettings.LegacyJavascriptBindingEnabled = true;
    browser = new ChromiumWebBrowser(
        "https://www.google.com");
    browser.RegisterJsObject("callbackObj", new CallbackObjectForJs());
    browser.LoadingStateChanged += Browser_LoadingStateChanged;
    browser.Dock = DockStyle.Fill;
    Controls.Add(browser);
}

private void Browser_LoadingStateChanged(object sender,
    LoadingStateChangedEventArgs e) {
    if (!e.IsLoading) {
        var script = @"
            var data = document.getElementsByTagName('a');
            Array.from(data).forEach((a) => {
                a.addEventListener('click', function(e){
                    if(callbackObj.handleAClick(this.href)) {
                        e.preventDefault();
                    }
                });
            });";
        browser.ExecuteScriptAsync(script);
    }
}

您使用的是
WPF
还是
WinForms
?感谢您的回复!我正在使用WinForms。不幸的是,
WinForms
中没有处理程序。哦,我明白了。你有没有别的办法可以向我建议?谢谢我的主要目标是让用户只在一个网页上,他/她只能滚动浏览该网页,但不能单击该网页。您可以使用OnBeforeBrowse取消导航,阻止链接执行任何操作。要挂接鼠标,您必须通过子窗口查找接收鼠标事件的窗口,并使用NatveWindow挂接鼠标。您使用的是
WPF
还是
WinForms
?感谢您的回复!我正在使用WinForms。不幸的是,
WinForms
中没有处理程序。哦,我明白了。你有没有别的办法可以向我建议?谢谢我的主要目标是让用户只在一个网页上,他/她只能滚动浏览该网页,但不能单击该网页。您可以使用OnBeforeBrowse取消导航,阻止链接执行任何操作。要挂接鼠标,您必须在子窗口中查找接收鼠标事件的窗口,并使用NatveWindow挂接它。我最近添加了一个新功能,可用于简化此类场景。有关详细信息,请参见。我在第一次阅读时没有注意到您使用的是
RegisterJsObject
,这可能是在不远的将来被移除。强烈建议不要使用
sync
版本(它是
RegisterJsObject
的一个帮助函数),而
sync
版本将保留用于遗留应用程序,基本上是任何升级的应用程序。任何开发应用程序的人都应该使用我链接到的
async
版本或
CefSharp.PostMessage
函数。我知道
javascript事件处理程序
是一个同步函数,不能以异步方式调用
preventDefault
。@amaitland感谢您的评论,我将查看链接:)我最近添加了一个新功能,可用于简化此类场景。有关详细信息,请参阅。我在第一次仔细阅读时没有注意到您正在使用的是
RegisterJsObject
,它可能会在不久的将来被删除。强烈建议不要使用
sync
版本(它是
RegisterJsObject
的一个帮助函数),而
sync
版本将保留用于遗留应用程序,基本上是任何升级的应用程序。任何开发应用程序的人都应该使用我链接到的
async
版本或
CefSharp.PostMessage
函数。我知道
javascript事件处理程序
是一个同步函数,无法以异步方式调用
preventDefault
。@amaitland感谢您的评论,我将检查链接:)