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

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

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

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

  3. Я попытался изменить элемент OnContextMenu в HTML, не повезло.

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

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

5 ответов

Решение

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

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

void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) {
    //don't let users go anywhere else
    if (e.Url != webBrowser1.Url) {
        e.Cancel = true;
    }
}

На самом деле не так сложно использовать нативный API-интерфейс управления HTML (не IWebBrowser2 и др.) С помощью P/Invoking из C#, если вы чувствуете, что недостаточно управляете WebBrowser.

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

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

или же

  • полностью отключите контекстное меню, отправив ему 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 и решить, стоит ли продолжать показывать меню или нет или сделать что-то еще.

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

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

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