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

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

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

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
6 108
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

   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>

Мы рассматривали решение javascript, и оно, безусловно, сработает, однако центральный фрагмент кода для этого находится в написанном нами приложении winforms для веб-браузера, которое используется для отображения многих веб-сайтов. Нам принадлежат все веб-сайты, поэтому мы могли это сделать, но я искал что-то простое

Anderson Imes 14.10.2008 11:42

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

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

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

Anderson Imes 14.10.2008 11:40

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

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

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

Надеюсь, это поможет вам Андерсон Имес

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