Consenti solo il menu contestuale Copia / Incolla nel controllo System.Windows.Forms.WebBrowser

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

  •  03-07-2019
  •  | 
  •  

Domanda

Il controllo WebBrowser ha una proprietà chiamata " IsWebBrowserContextMenuEnabled " che disabilita tutte le possibilità di fare clic con il tasto destro su una pagina Web e vedere un menu di scelta rapida. Questo è molto vicino a ciò che voglio (non voglio che nessuno sia in grado di fare clic con il pulsante destro del mouse e stampare, tornare indietro, selezionare proprietà, visualizzare l'origine, ecc.)

L'unico problema è che disabilita anche il menu di scelta rapida che appare in TextBox per copia / incolla, ecc.

Per chiarire questo, questo è ciò che non voglio:
 badcontext

Questo è quello che voglio:
 goodcontext

Vorrei disabilitare il menu contestuale principale, ma consento quello che appare in TextBox. Qualcuno sa come lo farei? L'evento WebBrowser.Document.ContextMenuShowing sembra promettente, ma non sembra identificare correttamente l'elemento su cui l'utente fa clic con il tasto destro del mouse, tramite il parametro " FromElement " del parametro HtmlElementEventArgs; e " ToElement " proprietà, né il mittente non è altro che l'elemento HtmlDocument.

Grazie in anticipo!

È stato utile?

Soluzione

hai pensato di scrivere il tuo menu contestuale in javascript? Basta ascoltare l'utente facendo clic con il pulsante destro del mouse sul corpo, quindi mostrare il menu con i comandi copia e incolla (suggerimento: element.style.display = " block | none "). Per copiare, esegui il seguente codice:

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

E per incollare:

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

Fonte:

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

NOTA: funziona solo in IE (che va bene per la tua applicazione).

So che non è assolutamente a prova di proiettile, ma ecco un esempio di codice che dovrebbe iniziare:

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

Altri suggerimenti

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

Spero che questo ti aiuti Anderson Imes

Una rapida occhiata alla Documentazione MSDN mostra che nessuno degli eventi del mouse (clic, pulsante giù / su ecc.) è supportato per essere utilizzato nel programma. Temo che sia o: disabilita i menu conetxt o li consenti.

Se li disabiliti, l'utente può comunque copiare & amp; incolla usando le scorciatoie da tastiera (Ctrl-C, Ctrl-V). Forse questo ti dà la funzionalità di cui hai bisogno.

Abbiamo finito per usare una combinazione di entrambi i commenti sopra. Più vicino al secondo, motivo per cui gli ho dato credito.

Esiste un modo per sostituire il menu di scelta rapida sia sul codice Web lato client sia tramite winforms, che è l'approccio che abbiamo adottato. Non volevo davvero riscrivere il menu contestuale, ma questo sembra averci dato il giusto mix di controllo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top