Разрешить только копирование/вставку контекстного меню в элементе управления System.Windows.Forms.WebBrowser

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

  •  03-07-2019
  •  | 
  •  

Вопрос

Элемент управления WebBrowser имеет свойство IsWebBrowserContextMenuEnabled, которое отключает любую возможность щелкнуть правой кнопкой мыши на веб-странице и просмотреть контекстное меню.Это очень близко к тому, что я хочу (я не хочу, чтобы кто-то мог щелкнуть правой кнопкой мыши и распечатать, нанести ответный удар, нажать свойства, просмотреть источник и т. д.).

Единственная проблема заключается в том, что это также отключает контекстное меню, которое появляется в текстовых полях для копирования/вставки и т. д.

Чтобы прояснить это, вот чего я не хочу:
badcontext

Вот чего я хочу:
goodcontext

Я хотел бы отключить главное контекстное меню, но разрешить то, которое появляется в текстовых полях.Кто-нибудь знает, как бы я это сделал?Событие WebBrowser.Document.ContextMenuShowing выглядит многообещающе, но, похоже, не идентифицирует должным образом элемент, на котором пользователь щелкает правой кнопкой мыши, ни через свойства «FromElement» и «ToElement» параметра HtmlElementEventArgs, ни отправитель не является ничем иным, как HtmlDocument. элемент.

Заранее спасибо!

Это было полезно?

Решение

Вы рассматривали возможность написания собственного контекстного меню на JavaScript?Просто послушайте, как пользователь щелкает правой кнопкой мыши по телу, а затем покажите меню с командами копирования и вставки (подсказка:element.style.display = «блок|нет»).Для копирования выполните следующий код:

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

И вставить:

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

Источник:

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

ПРИМЕЧАНИЕ:Это работает только в IE (что подходит для вашего приложения).

Я знаю, что он ни в коем случае не является пуленепробиваемым, но вот пример кода, с которого вам следует начать:

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

Другие советы

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

Надеюсь, это поможет тебе, Андерсон Аймс.

Быстрый взгляд на Документация MSDN показывает, что ни одно из событий мыши (щелчок, нажатие кнопки вверх/вверх и т. д.) не поддерживается для использования в вашей программе.Боюсь, это либо или:Либо отключите контекстные меню, либо разрешите их.

Если вы их отключите, пользователь по-прежнему сможет копировать и вставлять, используя сочетания клавиш (Ctrl-C, Ctrl-V).Возможно, это даст вам необходимую функциональность.

В итоге мы использовали комбинацию обоих приведенных выше комментариев.Ближе ко второму, поэтому я отдал ему должное.

Существует способ заменить контекстное меню как в веб-коде на стороне клиента, так и через winforms, и именно этот подход мы и использовали.Мне действительно не хотелось переписывать контекстное меню, но, похоже, это дало нам правильное сочетание элементов управления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top