Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: контекстное меню windows

Доброго времени суток.
Подскажите, есть ли у кого простой пример(в исходниках) dll которое после регистрации COM объекта появляеться в контекстном меню windows и имеет свою иконку.
Заранее благодарен.
Ответ:
Вот  посмотрите (не код, но какие то его кусочки  :-D )
И 
Вопрос: Как добавить в стандартное контекстное меню Windows свою программу?

Доброго времени суток!
У меня такой вопрос - как добавить в стандартное контекстное меню Windows свою программу? Например, щёлкаем ПКМ на картиночке - появляется контекстное меню.

->проверить на вирусы (антивирус)
-> архивировать (архиватор)

Как добавить действие?

-> сделать что-то (моя программа)

***

Второй вопрос, после того как открываем таким способом свою программу, как с ней делать какие либо действия? В программе есть кнопка "открыть", где появляется OpenFileDialog. Как я думаю, нужно как-то "словить" файл, открытый из контекстного меню или драг-дропа на программу, и ввести его в поле открытия в замен OpenFileDialog.FileName.
Ответ: Command() - это аргементы, с которыми запущена программа, типа "C:\программа.exe -maximized", где вот это " -maximized" и есть аргемент хранящийся в Command().
В вашем же случает аргементом передается путь к файлу, на котором кликнули в проводнике.
Вопрос: Работа с контекстным меню Windows

Здравствуйте. Каким образом можно сделать так, что бы при вызове контекстного меню у Файлов/Папок появлялся новый пункт, при нажатии которого открывалась программа, и она показывала, какой файл/папку пользователь выбрал?

Я знаю, что нужно модифицировать реестр, но вопрос в том, как и что.

Заранее спасибо.
Ответ: NikitaDreemurr,
Вопрос: Контекстное меню на dataGridView с множественным выбором

Всем привет, в сети ничего подобного не нашел. существует столбец с именами, хочу по нажатию пкм получить контекстное меню в котором можно выбрать те имена которые необходимо отобразить. данные загружаются с БД. Выбор одного имени сложности не предоставляет, а вот при выборе нескольких спотыкаюсь. Как сделать множественный выбор в контектном меню на подобии ChekedListBox?

Добавлено через 4 часа 17 минут
некто не знает или я не понятно объяснил....
Ответ:
Сообщение от dem_on
некто не знает или я не понятно объяснил....
Чего ж не знает, знает. Просто это довольно муторно. И к тому же это не очень удачное интерфейсное решение.
Сообщение от dem_on
существует столбец с именами, хочу по нажатию пкм получить контекстное меню в котором можно выбрать те имена которые необходимо отобразить. данные загружаются с БД. Выбор одного имени сложности не предоставляет, а вот при выборе нескольких спотыкаюсь. Как сделать множественный выбор в контектном меню на подобии ChekedListBox?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
        //cantains selected values for each column
        Dictionary<string, HashSet<string>> selectedValuesforColumns = new Dictionary<string, HashSet<string>>();
 
        private void cmGrid_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (dgvMain.SelectedCells.Count == 0) return;
            //get col name
            var col = dgvMain.SelectedCells.OfType<DataGridViewCell>().First().OwningColumn.Name;
            //get unique values from column (or from DB)
            var vals = dgvMain.Rows.OfType<DataGridViewRow>().Select(r => r.Cells[col].Value.ToString()).Distinct().OrderBy(s=>s);
            //
            if (!selectedValuesforColumns.ContainsKey(col))
                selectedValuesforColumns.Add(col, new HashSet<string>());
 
            //create menu items
            cmGrid.Items.Clear();
            cmGrid.AutoClose = false;
            foreach (var val in vals)
                cmGrid.Items.Add(new ToolStripMenuItem(val) { Checked = selectedValuesforColumns[col].Contains(val), CheckOnClick = true });
 
            //additional items
            cmGrid.Items.Add(new ToolStripSeparator());
            var applyItem = new ToolStripMenuItem("Apply filter");
            cmGrid.Items.Add(applyItem);
            applyItem.Click += (o, O) =>
            {
                cmGrid.Close();
                selectedValuesforColumns[col] = new HashSet<string>(cmGrid.Items.OfType<ToolStripMenuItem>().Where(it => it.Checked).Select(it=>it.Text));
                OnFilterChanged();
            };
            var cancelItem = new ToolStripMenuItem("Cancel");
            cmGrid.Items.Add(cancelItem);
            cancelItem.Click += (o, O) =>
            {
                cmGrid.Close();
            };
        }
 
        private void OnFilterChanged()
        {
            //...
        }
где dgvMain - грид, cmGrid - контекстное меню для грида

Вопрос: Как отобразить контекстное меню для иконки в трее?

Добрый день! Подскажите пожалуйста, как запустить контекстное меню трея во время работы функции(программы)?
Ответ: Sanya_sa,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
private void button3_Click_1(object sender, EventArgs e)
        {
            
            string filename;
 
            
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
               // Работа в фоновом режиме, перемещение программы в трей
                Hide();
                notifyIcon1.Icon = new Icon("Lemon64 (1).ico");
                notifyIcon1.BalloonTipTitle = "Программа GPS_Photo_Background начала свою работу";
                notifyIcon1.BalloonTipText = "Обратите внимание что программа была спрятана и продолжит свою работув трее.";
                notifyIcon1.ShowBalloonTip(5000);//показывает сколько милисекунд будет спрятана программа
                
                //
                filename = folderBrowserDialog1.SelectedPath;//запись в переменную путь
                    textBox3.Text = filename;//вывод пути
 
                string[] PathPhoto3 = Directory.GetFiles(filename, "*.*", SearchOption.AllDirectories);
 
                //количество файлов
                int SumFiles = PathPhoto3.Length;
                    label2.Text = SumFiles.ToString();
                //
 
                //=====Запуск функции Function1===============
                    Function1(PathPhoto3, filename);
                //============================================
 
                //Удаление лишних папок
                string[] dirs = Directory.GetDirectories(filename, "*", SearchOption.AllDirectories);
 
                for (int y = dirs.Length - 1; y >= 0; y--)
                {
                    if (Directory.GetFileSystemEntries(dirs[y]).Length == 0)
                        Directory.Delete(dirs[y]);
                }
                //
            }
            string filename2 = folderBrowserDialog1.SelectedPath;
            string[] dirs2 = Directory.GetDirectories(filename2, "*", SearchOption.AllDirectories);
            int SumFiles2 = dirs2.Length;
            label6.Text = SumFiles2.ToString();
            
 
            //Работа в фоновом режиме, перемещение программы в трей
            notifyIcon1.Icon = SystemIcons.Exclamation;
            notifyIcon1.Icon = new Icon("yes.ico");
            notifyIcon1.BalloonTipTitle = "Программа GPS_Photo_Background завершила свою работу";
            notifyIcon1.BalloonTipText = "Вы можете перейти в указанную папку и просмотреть результат работы программы GPS_Photo_Background.";
            notifyIcon1.ShowBalloonTip(5000);//показывает сколько милисекунд будет спрятана программа
            }
        //Контекстное меню
        private void openToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Show();
        }
 
        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Hide();
        }
 
        private void exitToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            this.Show();
            
        }
Вопрос: Системное Контекстное меню

Давно сделал свою программу с контекстным меню (вызывается в проводнике правой кнопкой мыши).
В 32 разрядных windows все работало 
Поставил win8 64x и работать перестало  .
Думаю что из за того что mymnu.dll скомпилирована 32 разрядным delphi (delphi7).

Для начала пожалуйста скомпилируйте мой dll 64 разрядным компилятором , я проверю будет ли работать.
Можете отправить скомпилированный dll на адрес SlaUr66@mail.ru.Буду вам очень признателен.

В прикрепленном файле исходники mymnu.dll кому-то может пригодится как пример создания контекстного меню.

Это сообщение отредактировал(а) SlaUr - 17.10.2014, 13:52

Присоединённый файл ( Кол-во скачиваний: 3 )
 
Ответ:
Давно сделал свою программу с контекстным меню (вызывается в проводнике правой кнопкой мыши).
В 32 разрядных windows все работало 
Поставил win8 64x и работать перестало  .
Думаю что из за того что mymnu.dll скомпилирована 32 разрядным delphi (delphi7).

Для начала пожалуйста скомпилируйте мой dll 64 разрядным компилятором , я проверю будет ли работать.
Можете отправить скомпилированный dll на адрес SlaUr66@mail.ru.Буду вам очень признателен.

В прикрепленном файле исходники mymnu.dll кому-то может пригодится как пример создания контекстного меню.

Это сообщение отредактировал(а) SlaUr - 17.10.2014, 13:52

Присоединённый файл ( Кол-во скачиваний: 3 )
 
Вопрос: Создание контекстного меню для собственного виджета

Здравствуйте. Помогите советом. Имеется графический интерфейс программы (ниже на картиночке). Мне необходимо осуществить реализацию выбора отдельного блока с помощью клавиш клавиатуры (стрелочек), а при нажатии на пробел должен выполняться выброс контекстного меню с некоторыми надписями. Надписи не так важны на данном этапе. Самое важное это само меню. Я реализовал выброс меню, но по нажатию правой клавиши мыши. Ниже приведён код, определяющий класс одного типа виджета с реализацией меню. Заранее большое спасибо.
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
MyWidget::MyWidget(int countButton, bool VHAligment, QList<QString> *titles,
                   QList<QString> *_widgMenu, QList<int> *_countMenu, QWidget *parent)
    :QWidget(parent)
{
    widget = new QFrame(this);
    widget->setStyleSheet("QFrame {"
                          "border: 3px solid black;"
                          "border-radius: 10px; }");
    /*Контекстное меню*/
    int count_Menu = _countMenu->takeLast();
    for(int j = 0; j < count_Menu; ++j)
        widget->addAction(new QAction(_widgMenu->takeLast(), widget));
    widget->setContextMenuPolicy(Qt::ActionsContextMenu);
    /*Контекстное меню*/
 
    titleWidget = new QLabel(titles->takeLast(), this);
    titleWidget->setAlignment(Qt::AlignCenter);
    titleWidget->setStyleSheet("QLabel {"
                               "border: 0px; }");
    titleWidget->setContentsMargins(0, 5, 0, 5);
 
    separator = new QFrame(this);
    separator->setFrameStyle(QFrame::HLine | QFrame::Plain);
 
    QGridLayout *qGridLayoutButtons = new QGridLayout;
 
    for(int i = 0; i < countButton; ++i)
    {
        nameLabel = new QLabel(titles->takeLast());
        nameLabel->setAlignment(Qt::AlignCenter);
        nameLabel->setMinimumHeight(55);
        nameLabel->setMinimumWidth(55);
        nameLabel->setMaximumHeight(55);
        nameLabel->setMaximumWidth(55);
        nameLabel->setStyleSheet("QLabel {"
                                 "border: 2px solid black;"
                                 "border-radius: 10px; }");
        if(VHAligment)
            qGridLayoutButtons->addWidget(nameLabel, 2, i);
        else
            qGridLayoutButtons->addWidget(nameLabel, i + 2, 0);
    }
 
    labelsBox = new QGroupBox;
    labelsBox->setStyleSheet("QGroupBox {"
                             "border: 0px; }");
    labelsBox->setSizePolicy(QSizePolicy::Expanding,
                             QSizePolicy::Expanding);
    labelsBox->setLayout(qGridLayoutButtons);
 
    QVBoxLayout *qVBoxLayoutWidgetComponent = new QVBoxLayout;
    qVBoxLayoutWidgetComponent->setContentsMargins(0, 0, 0, 0);
    qVBoxLayoutWidgetComponent->setSpacing(0);
    qVBoxLayoutWidgetComponent->addWidget(titleWidget);
    qVBoxLayoutWidgetComponent->addWidget(separator);
    qVBoxLayoutWidgetComponent->addWidget(labelsBox);
    widget->setLayout(qVBoxLayoutWidgetComponent);
 
    // Компоновщик для виджета
    QGridLayout *qGridLayoutMain = new QGridLayout;
    qGridLayoutMain->addWidget(widget);
    qGridLayoutMain->setContentsMargins(3, 3, 3, 3);
    setLayout(qGridLayoutMain);
}
Ответ: Нашёл решение проблемы размеров. Я просто указал минимальный размер окна, который может быть у главного окна (в моём случае это виджет). В результате все дочерние виджеты делаются компановщиками нужного размера. Была только проблема с одним из более маленьких виджетов, а именно с именем "8148", на котором внутренние блоки расположены вертикально. Они не помещались в нём, залезали друг на друга. Это решилось тем же способом - опять же указанием минимального размера. Другого выхода я не нашёл. Как я заметил, если наследовать виджеты от базового класса QWidget и помещать все компоненты на QFrame, то таких проблем с размерами не замечается (как я делал в самом начале), соответственно можно вывести оптимальные минимальные размеры, которые принимают виджеты при запуске программы.
Код C++ (QT)
1
2
3
4
QMessageBox msgBox;
msgBox.setText(QString::number(myWidgets->width()));
msgBox.setIcon(QMessageBox::Information);
msgBox.exec();
Тем самым, узнав эти размеры, можно использовать их, указав их виджету:
Код C++ (QT)
1
myWidgets->setMaximumHeight(50);
или через setStayleSheet:
Код C++ (QT)
1
2
3
4
5
widget.setStyleSheet("MainWidget {"
                     "max-height: 658px;"
                     "max-width: 1024px;"
                     "min-height: 630px;"
                     "min-width: 717px; }");
С большой долей вероятности могу сказать, что это не самый верный и лучший способ, но какой я придумал и решил поделиться. По-другому не знаю как сделать. Может кому-нибудь пригодится.

P.S. Контекстное меню я сделал так, как сказал icpu. Спасибо ему большое за всё.
Вопрос: Сделать недоступными пункты контекстного меню

Всем привет!
Есть ListView и контекстное меню - Добавить Удалить и Редактировать
Как сделать следующее,
Например если мы не выбрали не одну из строк, то пункт меню удалить и редактировать будет неактивным
И как получить индекс выбранной строки
Ответ: Можно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System.Windows.Forms;
 
namespace WindowsFormsApplication5
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
            var menu = new ContextMenuStrip();
            var add = new ToolStripMenuItem {Text = "Add"};
            menu.Items.Add(add);
            var edit = new ToolStripMenuItem { Text = "Edit" };
            menu.Items.Add(edit);
            var del = new ToolStripMenuItem { Text = "Delete" };
            menu.Items.Add(del);
            listBox1.ContextMenuStrip = menu;
            listBox1.ContextMenuStrip.Opening += (sender, args) =>
            {
                edit.Enabled = listBox1.SelectedIndex >= 0;
                del.Enabled = listBox1.SelectedIndex >= 0;
            };
        }
    }
}
Ну и соответственно индекс строки:
C#
1
listBox1.SelectedIndex
Вопрос: Ссылка на компонент из контекстного меню

Есть контекстное меню, в нем одна кнопка. Данное меню сразу у нескольких однотипных компонентов. Как при клике на кнопку из этого меню получить ссылку на компонент, за которым оно (меню) закреплено?
Ответ: смотрите свойство меню SourceControl:
C#
1
contextMenuStrip1.SourceControl
Вопрос: Как запретить контекстное меню в WebBrowser?

Не подскажите. как можно отключить клик правой кнопки мыши. Например у меня подгружается ролик с ютуба в webbrovser и чтобы нельзя было правой кнопкой кликнуть на него или чтобы контекстное меню не открывалось. А то пролистал много чего и нужного ничего не нашел.
Ответ: Я так пробовал, но при подгрузке ролика с ютуба не рабает. Все равно открывает меню при нажатии правой кнопки.