Отключить контекстное меню в WebBrowser .NET CF 3.5

Я использую элемент управления WebBrowser в .NET CF 3.5 для приложения устройства Windows CE, и по соображениям безопасности необходимо отключить контекстное меню. Я пробовал множество вещей, ни одна из которых, похоже, не работает для мобильных устройств с .NET CF 3.5:

  1. Я попытался разместить pictureBox поверх WebBrowser и сделать его прозрачным. К сожалению, прозрачность не работает, и мой браузер превращается в белый ящик.

  2. Я пробовал реализовать новый настраиваемый прозрачный элемент управления для размещения в веб-браузере, аналогичный this < / а>.

  3. Я пробовал редактировать элемент OnContextMenu в html, не повезло.

  4. Я попытался переопределить CreateParams, чтобы сделать прозрачный PictureBox в браузере, отмеченный как одно из решений здесь.

Кажется, что в Интернете есть много решений для этого, но ни одно из них, похоже, не работает для Windows CE с .NET CF 3.5. Я считаю, что это связано с тем, что WebBrowser имеет гораздо более простую реализацию, чем полная версия .NET 3.5. Итак, мой вопрос: есть ли способ отключить контекстное меню для элемента управления WebBrowser?


person John Leehey    schedule 11.04.2011    source источник


Ответы (5)


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

person ctacke    schedule 11.04.2011
comment
уу, это выглядит глупо (у меня не так много опыта разработки Windows). Я все же попробую! - person John Leehey; 12.04.2011
comment
Итак, я выделил WebBrowser из руководства Microsoft здесь: msdn.microsoft.com /en-us/library/ms229669.aspx Я пробовал отключать сообщения WM_NOTIFY и WM_CONTEXTMENU, но ни одно из них, похоже, не работает. Как только я захожу в новый веб-браузер, ничего не меняется. Кажется, что сообщение перехватывается неправильно, потому что обработчик никогда не вызывается при отладке. Возможно ли, что подписанные значения int в уведомлениях отличаются? У меня 0x4E для WM_NOTIFY и 0x007B для WM_CONTEXTMENU. - person John Leehey; 14.04.2011
comment
Итак, создав подклассы, я обнаружил, что на самом деле нет способа перехватить и отбросить всплывающее контекстное меню. Мое решение заключалось в том, чтобы подключиться к сообщению WM_CONTEXTMENU (аналогично подключению сообщения Microsoft TreeView по ссылке выше) и открыть окно сообщения, как только событие пройдет. MessageBox будет отвлекать от контекстного меню до того, как пользователь сможет установить какой-либо фокус или щелкнуть по нему, предоставляя мне приемлемое решение. Спасибо! - person John Leehey; 15.04.2011

На самом деле не так сложно использовать собственный HTML Control API (не IWebBrowser2 и др.) Путем P / Вызов его из C #, если вы чувствуете, что недостаточно отвечаете за управляемый WebBrowser.

Если вы пойдете этим путем, вы можете либо

  • перехватить уведомление контекстного меню NM_CONTEXTMENU, которое отправляется на хост / родительский элемент HTML-элемента управления, когда контекстное меню должно быть показано, и не позволять ему переходить к обработчику сообщений окна по умолчанию

or

  • полностью отключите контекстное меню, отправив ему DTM_ENABLECONTEXTMENU с FALSE.

Был там, сделал это, оба работают.

Изменить:

В этом случае есть 3 возможных уровня сложности:

  1. Если элемент управления HTML не создан со стилем окна HS_CONTEXTMENU, по умолчанию для него будет отключено контекстное меню. Так что, если все, что вам нужно сделать, это отключить его, тогда нативная функция CreateWindowEx - единственная необходимая нативная функция Win32 API для P / Invoke.
  2. С другой стороны, если вы действительно хотите включить или отключить контекстное меню во время выполнения, вы можете P / Invoke SendMessage с помощью DTM_ENABLECONTEXTMENU и TRUE / FALSE.
  3. И, наконец, если вы хотите максимально контролировать меню или делать что-то совершенно произвольное, когда элемент управления HTML хочет показать меню, вам нужно P / Invoke SetWindowLong создать подкласс родительского элемента, прослушать NM_CONTEXTMENU и решить, следует ли продолжать показ меню или нет или сделать что-то совсем другое.
person Johann Gerell    schedule 12.04.2011
comment
Вы знаете какие-нибудь хорошие примеры этого в Интернете? Я погуглил, но я не совсем уверен, что влечет за собой P / Invoking. Я не совсем понимаю, как использовать собственный HTML Control API. Спасибо. - person John Leehey; 14.04.2011
comment
@John: Вы имеете в виду примеры P / Invoking в целом или в данном конкретном случае? В общем случае я думаю, что msdn.microsoft.com/en-us/library /aa446536.aspx - неплохое вступление. В этом конкретном случае вам нужно будет P / Invoke, вне моей головы, просто встроенная функция Win32 API CreateWindowEx (для создания элемента управления HTML с управляемым окном по вашему выбору в качестве родительского) в простейшем сценарии. - person Johann Gerell; 15.04.2011
comment
@John: Я понял, что вам может понадобиться дополнительная информация о нативных частях этого, поэтому я добавил раздел, см. Изменить: - person Johann Gerell; 15.04.2011
comment
Спасибо за ваш ответ! К счастью, мне удалось найти обходной путь без использования P / Invoke. Я обязательно воспользуюсь этой информацией, мне нужно изучить использование P / Invoke, чтобы отключить меню параметров SIP (по несвязанной проблеме). Спасибо еще раз! - person John Leehey; 15.04.2011

Ни один из этих возможных ответов не работает. Поэтому я отказался от попыток скрыть контекстное меню и просто добавил обработчик событий для события Navigating и отменил навигацию, если это не тот же URL, что и тот, на который я его изначально отправил. Он по-прежнему показывает контекстное меню, но щелчок по чему-либо не отправляет его на другую страницу.

void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
    //don't let users go anywhere else
    if (e.Url != webBrowser1.Url) {
        e.Cancel = true;
    }
}
person Jason    schedule 04.11.2011
comment
Если вы прочитаете мой комментарий к принятому ответу, вы увидите, что правы, ни один из этих ответов у меня не сработал, но я смог найти приемлемое альтернативное решение из одного из ответов. Ваше решение по-прежнему позволяет контекстное меню, которое оставит дыру в безопасности, о которой я беспокоился, открытой. Спасибо за вклад! - person John Leehey; 05.11.2011

Реализация элемента управления WebBrowser в .NET CF не содержит свойства IsWebBrowserContextMenuEnabled?

person abatishchev    schedule 12.04.2011
comment
нет, у него нет никаких методов, переменных или событий, связанных с контекстным меню. - person John Leehey; 14.04.2011

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

person ctacke    schedule 13.04.2011