Permitir apenas copiar/colar menu de contexto no controle System.Windows.Forms.WebBrowser

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

  •  03-07-2019
  •  | 
  •  

Pergunta

O controle WebBrowser possui uma propriedade chamada "IsWebBrowserContextMenuEnabled" que desativa toda a capacidade de clicar com o botão direito em uma página da web e ver um menu de contexto.Isso está muito próximo do que eu quero (não quero que ninguém possa clicar com o botão direito e imprimir, revidar, clicar em propriedades, visualizar a fonte, etc.).

O único problema é que isso também desativa o menu de contexto que aparece em TextBoxes para copiar/colar, etc.

Para deixar isso mais claro, é isso que eu não quero:
badcontext

Isto é o que eu quero:
goodcontext

Gostaria de desabilitar o menu de contexto principal, mas permitir aquele que aparece nos TextBoxes.Alguém sabe como eu faria isso?O evento WebBrowser.Document.ContextMenuShowing parece promissor, mas não parece identificar corretamente o elemento no qual o usuário está clicando com o botão direito, seja por meio das propriedades "FromElement" e "ToElement" do parâmetro HtmlElementEventArgs, nem o remetente é nada além do HtmlDocument elemento.

Desde já, obrigado!

Foi útil?

Solução

Você já pensou em escrever seu próprio menu de contexto em JavaScript? Basta ouvir o usuário clicando com o botão direito do mouse no corpo e mostre seu menu com comandos de copiar e colar (dica: element.style.display = "bloco | nenhum"). Para copiar, execute o seguinte código:

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

E para colar:

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

Fonte:

http://www.geekpedia.com/tutorial126_clipboard-cut-copy-and-sche-with-javascript.html

Nota: Isso funciona apenas no IE (o que é bom para o seu aplicativo).

Eu sei que não é à prova de balas, mas aqui está uma amostra de código que deve começar:

<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>

Outras dicas

//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 isso ajude você Anderson Imes

Uma rápida olhada no Documentação do MSDN mostra que nenhum dos eventos do mouse (clique, botão para baixo/para cima, etc.) é compatível para uso em seu programa.Receio que seja ou:Desative os menus do conetxt ou permita-os.

Se você desativá-los, o usuário ainda poderá copiar e colar usando atalhos de teclado (Ctrl-C, Ctrl-V).Talvez isso lhe dê a funcionalidade que você precisa.

Acabamos usando uma combinação dos dois comentários acima. Mais perto do segundo, e é por isso que lhe dei crédito.

Existe uma maneira de substituir o menu de contexto no código da Web do lado do cliente, bem como através do WinForms, que é a abordagem que adotamos. Eu realmente não queria reescrever o menu de contexto, mas isso parece ter nos dado a mistura certa de controle.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top