|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Как добавить мой пункт меню в стандартное контекстное меню Винды?
Здравствуйте, уважаемые!
Тыкаем правой кнопкой на заголовок любого окна любого приложения - появляется контекстное меню: Восстановить, Переместить, Размер, Свернуть, Развернуть, Закрыть (Alt+F4). Вопрос: как в это меню добавить свой пункт (вложенное подменю), а затем обрабатывать события по нажатию на него? Заранее спасибо! Последний раз редактировалось vinni, 14.03.2008 в 10:16. |
#2
|
||||
|
||||
то есть, на форме, или в самой винде, меню тебе нужно? если на форме то скорее всего юзай PopupMenu и обрабатывай нажатие правой кнопки мыши.
|
#3
|
|||
|
|||
В самом простом варианте - вот так.
Код:
unit asmMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } procedure WMSysCommand(var Msg: TWMSysCommand); message WM_SYSCOMMAND; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} const CM_ABOUT = WM_USER + 1; procedure TForm1.FormCreate(Sender: TObject); const SNewMenuItemCaption = 'About'; var Menu: HMENU; MenuItemInfo: TMenuItemInfo; lpszCapt: PChar; begin // Получаем дескриптор системного меню Menu := GetSystemMenu(Handle, False); // Добавляем пункт "About" GetMem(lpszCapt, Length(SNewMenuItemCaption) + 1); StrPCopy(lpszCapt, SNewMenuItemCaption); FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0); with MenuItemInfo do begin cbSize := SizeOf(MenuItemInfo); fMask := MIIM_STRING + MIIM_ID; fType := MFT_STRING; fState := 0; wID := CM_ABOUT; hSubMenu := 0; hbmpChecked := 0; hbmpUnchecked := 0; dwItemData := 0; dwTypeData := lpszCapt; cch := Length(SNewMenuItemCaption); end; InsertMenuItem(Menu, 0, True, MenuItemInfo); FreeMem(lpszCapt); // Добавляем разделитель после нашего пункта FillChar(MenuItemInfo, SizeOf(MenuItemInfo), 0); with MenuItemInfo do begin cbSize := SizeOf(MenuItemInfo); fType := MFT_MENUBARBREAK; end; InsertMenuItem(Menu, 1, True, MenuItemInfo); end; procedure TForm1.WMSysCommand(var Msg: TWMSysCommand); begin // Обрабатываем команду нашего пункта меню if Msg.CmdType = CM_ABOUT then ShowMessage('Insert item to system menu demo.'); inherited; end; end. Код:
AppendMenu(Menu, MF_STRING, SC_ABOUT, 'About'); Если вы хотите добавить подменю, то нужно его предварительно создать и указать его дескриптор в поле hSubMenu структуры TMenuItemInfo. Ну и флаги другие, конечно, выставить в fMask (MIIM_SUBMENU). Меню создается функцией CreateMenu Последний раз редактировалось Rosenkrantz, 14.03.2008 в 12:44. |
#4
|
|||
|
|||
Rosenkrantz, спасибо большущее! :-)
Буду пробовать :-) |
#5
|
|||
|
|||
Rosenkrantz, все норм, но нужно чтобы этот пункт меню добавлялся при правом клике не на мое приложение, а на заголовке окна ЛЮБОГО приложения :-)
Т.е., например, я запустил свою прогу (она свернута в трее), тыкаю правой на заголовке окна, например, MS Word или MS Excel, и там должен появиться (кроме стандартных) мой пункт меню (раскрывающееся подменю). |
#6
|
|||
|
|||
Вот в этом вызове
Код:
Menu := GetSystemMenu(Handle, False); Для этого можете использовать EnumWindows. Эта функция находит все окна приложений (но не находит их дочерние окна! для этого есть EnumChildWindows). Вот тут пример использования. Чтобы обрабатывать окна, которые будут открываться после запуска вашего приложения, можно поступить двояко. Первый вариант - повесить глобальный хук. Посмотрите описание функции SetWindowsHookEx. Обратите внимание - глобальный хук обязательно должен находиться в DLL. Либо можно просто периодически повторять перебор всех открытых окон и проверять - есть у них в меню ваш пункт или нет. Если нет, добавлять. В конце концов, мало кто, запустив приложение, сразу лезет в его системное меню. Запуская раз в 2-3 секунды перебор окон, вы свою задачу решите. Нужно только подобрать интервал, чтобы сильно не грузило систему. P.S. И, кстати, не забудьте удалить добавленные пункты меню, когда ваша программа будет завершаться. Последний раз редактировалось Rosenkrantz, 15.03.2008 в 15:46. |