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

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

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

Чтобы было понятнее, я не хочу:
badcontext

This is what I do want:
goodcontext

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

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

Ответы [ 4 ]

2 голосов
/ 14 октября 2008

Вы рассматривали возможность написания своего собственного контекстного меню в 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>
0 голосов
/ 12 ноября 2009
//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:

Я надеюсь, что это поможет вам Андерсон Аймс

0 голосов
/ 15 декабря 2008

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

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

0 голосов
/ 14 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...