Отключить контекстное меню в WebBrowser .NET CF 3.5 - PullRequest
1 голос
/ 12 апреля 2011

Я использую элемент управления 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?

Ответы [ 5 ]

1 голос
/ 05 ноября 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;
    }
}
1 голос
/ 13 апреля 2011

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

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

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

или

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

Был тамСделано так, что обе работы.

Редактировать:

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

  1. Если только HTMLэлемент управления создается в стиле окна HS_CONTEXTMENU, по умолчанию контекстное меню отключено.Поэтому, если все, что вы когда-либо захотите сделать, это отключить его, то родная CreateWindowEx - это единственная необходимая встроенная функция Win32 API для P / Invoke.
  2. С другой стороны, если вы do хотитечтобы включить и отключить контекстное меню во время выполнения, вы можете P / Invoke SendMessage с DTM_ENABLECONTEXTMENU и TRUE / FALSE.
  3. И, наконец, если вы хотите получить максимальный контроль над меню или сделать что-то совершенно произвольное, когда HTML-элемент управления хочетчтобы показать меню, вам нужно P / Invoke SetWindowLong, чтобы создать подкласс родительского элемента и прослушать NM_CONTEXTMENU и решить, стоит ли продолжать показывать меню или нет, или делать что-то совсем другое.
1 голос
/ 12 апреля 2011

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

0 голосов
/ 13 апреля 2011

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

0 голосов
/ 12 апреля 2011

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

...