Добавить пункт контекстного меню во все текстовые поля операционной системы в целом - PullRequest
8 голосов
/ 15 февраля 2011

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

Так будет, если новый элемент появится вкаждое текстовое поле, которое пользователь может ввести в любом месте окна?

Например, чтобы разрешить добавлять такие функции, как поиск выделенного текста с помощью средства проверки орфографии.

Ответы [ 4 ]

3 голосов
/ 13 мая 2011

Это технически невозможно с C #. Давайте представим следующую ситуацию. Предположим, вы успешно написали управляемое расширение, и оно «расширяет» любое контекстное меню текстового поля в системе. И, конечно, вы должны обрабатывать каждый новый пункт меню, который вы добавили. и для этого вам нужно внедрить свой управляемый код в каждый процесс, имеющий текстовое поле, и заменить его WindProc. Хорошо, предположим, что в системе есть управляемое приложение, написанное для версии .net, отличной от версии, которую вы использовали для расширения. Таким образом, в этом случае вы получите критическую ошибку во время внедрения расширения, потому что на процесс может быть загружена только одна версия .net. Так что нет способа написать надежный управляемый низкоуровневый хук или расширение оболочки. С здесь :

Глобальные хуки не поддерживаются в .NET Framework
За исключением WH_KEYBOARD_LL низкоуровневый хук и WH_MOUSE_LL низкоуровневый хук, вы не можете реализовать глобальные хуки в Microsoft .NET Framework. Чтобы установить глобальный хук, хук должен иметь нативный DLL экспорт, чтобы внедрить себя в другой процесс, который требует действительного, последовательная функция для вызова. это поведение требует экспорта DLL. .NET Framework не поддерживает DLL экспорт. Управляемый код не имеет понятия последовательного значения для функции указатель, потому что эти функции указатели являются прокси, которые построены динамически.

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

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

2 голосов
/ 15 февраля 2011

Наследуйте от текстового поля, которое вы пытаетесь использовать, и добавьте туда значение по умолчанию.Используйте свой класс вместо класса текстового поля.

1 голос
/ 12 мая 2011

Вы должны добавить мышиный крючок

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

(Хотя ужасный план ...)

0 голосов
/ 15 февраля 2011

Вызовите метод Bind с помощью формы и контекстного меню.

  void Bind(Control c, ContextMenu menu)
  {
     foreach (Control subcontrol in c.Controls)
        Bind(subcontrol);

     TextBox textBox = c as TextBox;
     if (textBox != null)
     {
         textBox.ContextMenu = menu;
     }
  }

Если вы добавляете динамическое текстовое поле, поместите его в начало метода Bind:

         c.ControlAdded += (s, e) => Bind(e.Control, menu);

Это вызывает метод Bind при каждом добавлении элемента управления в форму или другого элемента управления.

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