Как сделать контекстное меню в c

Обновлено: 03.07.2024

Однажды я уже рассказывал на Хабре, как можно добавить собственную команду в контекстное меню браузера Internet Explorer (Удобное дополнение к IE при написании обзоров / Internet Explorer / Хабрахабр). Сейчас я расскажу, как добавить свою команду в контекстное меню Проводника. Поехали.

Информация о контекстном меню Проводника и Рабочего стола хранится в разделе реестра HKEY_CLASSES_ROOT\Directory\Background\Shell. Именно отсюда система узнает, какие команды нужно отобразить в контекстном меню и какие программы нужно запустить, когда пользователь щелкает по выбранной команде меню. Таким образом, вооружившись этими знаниями, мы сможем сами создавать нужные нам команды.

Итак, чтобы добавить новую команду в контекстное меню, достаточно создать в разделе HKCR\Directory\Background\Shell новый подраздел. Предположим, мы хотим, чтобы в меню появилась команда, запускающая стандартный Блокнот. Создаем подраздел notepad и сразу можем проверить и убедиться, что в контекстном меню Рабочего стола появилась одноименная команда. Нам даже не пришлось перезагружать компьютер. Естественно, такая команда не очень нас устраивает, и мы хотим задать собственный текст, например, Блокнотик. Для этого редактируем параметр по умолчанию созданного подраздела и записываем для него новое значение, которое мы хотим видеть, например, прописываем слово Блокнотик. Снова проверяем и убеждаемся, что в контекстном меню появилась наша команда.


  • MUIVerb – значение данного параметра заменяет собой значение параметра по умолчанию, т.е. мы можем в этом параметре задать имя для команды в меню.
  • Extended – при наличии данного параметра без значения говорит системе о том, что команда должна отображаться только при нажатии клавиши Shift. Вы можете посмотреть на подраздел HKEY_CLASSES_ROOT\Directory\Background\shell\cmd, в котором содержится такой параметр. Поэтому, если держать нажатой клавишу Shift, то в контекстном меню появится команда Открыть окно команд.

Теперь перейдем к подразделам. Прежде всего, нужно создать подраздел command. Параметр по умолчанию данного подраздела должен содержать в себе команду, которая будет выполняться при выборе соответствующего элемента контекстного меню. В нашем случае, нужно прописать команду notepad.exe.


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

Включение/выключения эскизов

Рассмотрим практический пример создания собственной команды в меню Проводника. Если вы предпочитаете просматривать файлы в режиме Значки, то заметили, что, например, значки картинок отображаются в виде эскизов. В настройках папки можно изменить данное поведение и отключить показ эскизов. Но включать или отключать эти настройки очень утомительно. Судите сами – сначала надо нажать на клавишу Alt, чтобы появилась строка меню у Проводника, далее выбираем меню Сервис | Параметры папок…. После этого нужно переключиться на вкладку Вид и поставить или убрать флажок у команды Всегда отображать значки, а не эскизы. Упростим задачу при помощи реестра и небольшого VBS-сценария, который циклически меняет значения параметра IconsOnly в разделе HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced. Создадим новый раздел ToggleThumb в разделе HKEY_CURRENT_USER\Software\Classes\Directory\Background\Shell и присвоим параметру по умолчанию строковое значение Включить/Выключить эскизы. Тем самым мы создали новую команду для контекстного меню папки в Проводнике. Обратите внимание, что теперь мы используем раздел HKEY_CURRENT_USER, чтобы действие примера распространялось только на одного пользователя. Теперь создаем подраздел command и прописываем в параметре по умолчанию строку wscript.exe "%WinDir%\togglethumbs.vbs". Далее нужно создать сценарий, который будет переключать режим показа эскизов.

Сохраните созданный сценарий под именем togglethumbs.vbs и скопируйте его в папку Windows.
Теперь вы можете открыть Проводники и проверить работу новой команды. Для удобства я сначала выбрал режим Крупные значки, которые отображаются в виде эскизов.

Отображение файлов в виде эскизов

Далее я выбрал в контекстном меню пункт Включить/Выключить эскизы и получил следующий результат – вместо эскизов я увидел значки программы Adobe Photoshop, ознакомительную версию которой я поставил несколько дней назад на своем компьютере.

Отображение файлов в виде значков

Удаление содержимого папки без удаления самой папки

Практически аналогично добавляется собственная команда и в контекстное меню папки. Недавно я нашел один пример применения контекстного меню папки в Проводнике — Add Empty Folder Contents to Windows 7 Right Click Context Menu. | The Windows Club.

Автор примера рассказывает, как добавить в контекстное меню папки команду для удаления содержимого папки без удаления самой папки. Т.е. вам не придется открывать папку, выделять все файлы и нажимать на клавишу Delete, достаточно выбрать команду Удалить содержимое папки. Я немного модифицировал пример, чтобы он более органично смотрелся на русской версии Windows.

Для этого добавляем в раздел HKEY_CLASSES_ROOT\Directory\shell подраздел DeleteFolderContent и создаем в нем строковый параметр MUIVerb со строкой Удалить содержимое папки. Далее в разделе DeleteFolderContent создаем подраздел command и в его параметре по умолчанию прописываем строчку:

Все готово и можете пользоваться примером.

Заключение

Хочу предупредить, что я рассказал про основные приемы создания команд в контекстном меню Проводника. Реестр — достаточно сложная штука и существуют другие способы работы с контекстном меню.

Как сделать A) всплывающее меню B) найти строку, по которой щелкнули правой кнопкой мыши. Я знаю, что могу использовать selectedIndex, но могу щелкнуть правой кнопкой мыши, не меняя то, что выбрано? прямо сейчас я мог бы использовать выбранный индекс, но если есть способ получить данные без изменения того, что выбрано, то это было бы полезно.

Вы можете использовать CellMouseEnter и CellMouseLeave для отслеживания номера строки, над которой в данный момент наведена мышь.

Затем используйте объект ContextMenu для отображения всплывающего меню, настроенного для текущей строки.

Вот быстрый и грязный пример того, что я имею в виду .

Верный! и примечание для вас: var r = dataGridView1.HitTest (eX, eY); r.RowIndex работает НАМНОГО ЛУЧШЕ, чем при использовании мыши или currentMouseOverRow

Чтобы получить правильные координаты экрана, вы должны открыть контекстное меню следующим образом: m.Show(dataGridView1.PointToScreen(e.Location));

Причина, по которой эти ответы неверны, заключается в том, что они не учитывают разные схемы работы. Параметры специальных возможностей, удаленные подключения или перенос Metro / Mono / Web / WPF могут не работать, а сочетания клавиш не будут работать вправо (Shift + F10 или клавиша контекстного меню).

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

Это полностью имитирует подход, используемый Microsoft Excel. Если ячейка входит в выбранный диапазон, выбор ячеек не изменяется, и тоже CurrentCell . Если это не так, старый диапазон очищается, а ячейка выбирается и становится CurrentCell .

Если вам непонятно, CurrentCell где именно клавиатура фокусируется при нажатии клавиш со стрелками. Selected является ли оно частью SelectedCells . Контекстное меню будет отображаться при щелчке правой кнопкой мыши, как обрабатывается пользовательским интерфейсом.

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

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

Ключ должен использовать, CellContextMenuStripNeeded так как это даст вам контекстное меню.

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

В этом контексте MultiSelect есть True и SelectionMode есть FullRowSelect . Это просто пример, а не ограничение.

Иногда при разработке некоторых программных продуктов требуется создать пункт в контекстном меню ОС Windows. Чтоб справится с этой задачей нам потребуется поработать с реестром и зарегистрировать наш пункт меню. Вот вкратце что нам предстоит сделать.

Приступим непосредственно к написанию нашей программы.

1. Запускаем VS

2. Создаем новый проект WindowsFormsApplication

3. Добавляем из Toolbox_a две кнопки типа Button (первая кнопка для добавления нового пункта в контекстное меню, а другая соответственно для его удаления), два TextBox_a (первый для ввода названия нового меню, другая для ввода команды которая будет прикреплена к нашем пункту меню) ну и еще два Label_a для того чтоб подписать что есть что. Вот что у вас должно приблизительно получится.


4. Теперь переключимся в редактор кода и подключаем неймспейс для роботы с реестром using Microsoft.Win32.

5. Создадим две переменные для регистрации нашего меню в реестре

6. Обработаем события Click для первой кнопки "Add", и напишем следующий код:

7. Теперь обработаем события Click для второй кнопки "Remove" (надеюсь вы догадались что она будет делать, да она будет удалять наш пункт меню если он нам не понравится), и пишем следующий код:

Вот и все, теперь можно компилировать наше приложение и пробовать создавать собственные пункты в контекстном меню. Пример работы программы показан ниже:



Если у вас возникнут какие то вопросы или предложения пишите в комментариях или на почту, отвечу всем.

Визитной карточкой профессионального приложения является наличие контекстного меню. Контекстное меню — это меню, которое открывается при нажатии правой кнопки мыши. Для его реализации, также как и в случае всплывающего меню, используется класс QMenu. Отличие состоит лишь в том, что это меню не присоединяется к виджету QMenuBar.

Контекстное меню в программе на Qt

На рисунке показано окно программы и контекстное меню, отображаемое при нажатии правой кнопки мыши. В этом меню пользователь может выбрать одну из трех команд — Red (Красный), Green (Зеленый) или Blue (Синий), которые задают соответствующий цвет фона окна

В конструкторе класса ContextMenu создается виджет контекстного меню — указатель mpmnu. С помощью метода addAction() добавляются команды меню. Метод connect() соединяет сигнал меню triggered(QAction*) со слотом slotActivated(QAction*). Сигнал высылается каждый раз при выборе пользователем одной из команд меню. Этот слот получает указатель на объект действия. Благодаря тому, что наш класс ContextMenu унаследован от класса QTextEdit, мы можем устанавливать цвет фона при помощи строки в формате HTML — нужно только вызвать метод QTetxEdit::setHtml(). Сам цвет устанавливается в соответствии с именем выбранной команды, но без символа &, для чего вызывается метод QString::remove(). Строка с цветом записывается в переменную strColor.

Показ контекстного меню выполняется из метода обработки события контекстного меню QWidget::contextMenuEvent() и должен производиться на месте (координатах) указателя мыши, при нажатии правой кнопки. Для этого нужно передать в метод exec() значение объекта события контекстного меню, возвращаемое методом globalPos(). Этот метод возвращает объекты класса QPoint, содержащие координаты указателя мыши относительно верхнего левого угла экрана.

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

Для всех пунктов меню должны быть определены клавиши для быстрого вызова, символы которых обозначаются знаком подчеркивания в названии команды меню, а для наиболее важных или часто используемых команд — "горячие" клавиши, представляющие собой комбинации клавиш, которые интерпретируются программой как команды меню. Если вызов команды отображает диалоговое окно, то рекомендуется добавлять в конце имени команды три точки. Недоступные команды меню отображаются, как правило, серым цветом, сообщая пользователю о том, что данная команда не может быть выполнена.

Читайте также: