Permitir solo copiar / pegar el menú contextual en System.Windows.Forms.WebBrowser Control

StackOverflow https://stackoverflow.com/questions/200162

  •  03-07-2019
  •  | 
  •  

Pregunta

El control WebBrowser tiene una propiedad llamada " IsWebBrowserContextMenuEnabled " que inhabilita toda capacidad de hacer clic con el botón derecho en una página web y ver un menú contextual. Esto está muy cerca de lo que quiero (no quiero que nadie pueda hacer clic con el botón derecho e imprimir, devolver, recibir propiedades, ver la fuente, etc.).

El único problema es que esto también deshabilita el menú de contexto que aparece en TextBoxes para copiar / pegar, etc.

Para hacer esto más claro, esto es lo que no quiero:
 badcontext

Esto es lo que quiero:
 goodcontext

Me gustaría deshabilitar el menú de contexto principal, pero permitir el que aparece en los cuadros de texto. Alguien sabe cómo haría eso? El evento WebBrowser.Document.ContextMenuShowing parece prometedor, pero no parece identificar correctamente el elemento en el que el usuario está haciendo clic derecho, ya sea a través del parámetro HtmlElementEventArgs " FromElement " y " ToElement " propiedades, ni el remitente es nada más que el elemento HtmlDocument.

Gracias de antemano!

¿Fue útil?

Solución

¿has considerado escribir tu propio menú contextual en javascript? Solo escuche al usuario haciendo clic derecho en el cuerpo, luego muestre su menú con los comandos de copiar y pegar (pista: elemento.style.display = " bloque | ninguno "). Para copiar, ejecute el siguiente código:

   CopiedTxt = document.selection.createRange();
   CopiedTxt.execCommand("Copy");

Y para pegar:

   CopiedTxt = document.selection.createRange();
   CopiedTxt.execCommand("Paste");

Fuente:

http://www.geekpedia.com /tutorial126_Clipboard-cut-copy-and-paste-with-JavaScript.html

NOTA: esto solo funciona en IE (lo cual está bien para su aplicación).

Sé que no es a prueba de balas de ninguna manera, pero aquí hay un ejemplo de código que debería ayudarte a comenzar:

<html>
    <head>
        <script type = "text/javascript">
            var lastForm = null;
            window.onload = function(){

                var menu = document.getElementById("ContextMenu");
                var cpy = document.getElementById("CopyBtn");
                var pst = document.getElementById("PasteBtn");

                document.body.onmouseup = function(){
                    if (event.button == 2)
                    {
                        menu.style.left = event.clientX + "px";
                        menu.style.top = event.clientY + "px";
                        menu.style.display = "block";

                        return true;
                    }

                    menu.style.display = "none";
                };

                cpy.onclick = function(){
                    copy = document.selection.createRange();
                    copy.execCommand("Copy");
                    return false;
                };

                pst.onclick = function(){
                    if (lastForm)
                    {
                        copy = lastForm.createTextRange();
                        copy.execCommand("Paste");
                    }
                    return false;
                };
            };
        </script>
    </head>

    <body oncontextmenu = "return false;">
        <div id = "ContextMenu" style = "display : none; background: #fff; border: 1px solid #aaa; position: absolute;
            width : 75px;">
            <a href = "#" id = "CopyBtn" style = "display: block; color : blue; text-decoration: none;">Copy</a>
            <a href = "#" id = "PasteBtn" style = "display: block; color : blue; text-decoration: none;">Paste</a>
        </div>
        sadgjghdskjghksghkds
        <input type = "text" onfocus = "lastForm = this;" />
    </body>
</html>

Otros consejos

//Start:

function cutomizedcontextmenu(e)
{
    var target = window.event ? window.event.srcElement : e ? e.target : null;
    if( navigator.userAgent.toLowerCase().indexOf("msie") != -1 )
    {
        if (target.type != "text" && target.type != "textarea" && target.type != "password") 
        {
            alert(message);
            return false;
        }
    return true;
    }
    else if( navigator.product == "Gecko" )
    {
        alert(message);
        return false;
    }
} 

document.oncontextmenu = cutomizedcontextmenu;
//End:

Espero que esto te ayude, Anderson Imes

Un vistazo rápido a la MSDN documents muestra que ninguno de los eventos del mouse (clic, botón abajo / arriba, etc.) son compatibles con su programa. Me temo que es o bien: Deshabilitar los menús de conetxt, o permitirlos.

Si los desactiva, el usuario todavía puede copiar & amp; pegar utilizando atajos de teclado (Ctrl-C, Ctrl-V). Tal vez eso te da la funcionalidad que necesitas.

Terminamos usando una combinación de los dos comentarios anteriores. Más cerca del segundo, por lo que le di crédito.

Hay una manera de reemplazar el menú contextual tanto en el código web del lado del cliente como a través de winforms, que es el enfoque que tomamos. Realmente no quería volver a escribir el menú contextual, pero parece que esto nos ha dado la combinación correcta de control.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top