Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.03.2008, 10:07
vinni vinni вне форума
Начинающий
 
Регистрация: 26.01.2006
Сообщения: 135
Репутация: 10
По умолчанию Как добавить мой пункт меню в стандартное контекстное меню Винды?

Здравствуйте, уважаемые!

Тыкаем правой кнопкой на заголовок любого окна любого приложения - появляется контекстное меню: Восстановить, Переместить, Размер, Свернуть, Развернуть, Закрыть (Alt+F4).
Вопрос: как в это меню добавить свой пункт (вложенное подменю), а затем обрабатывать события по нажатию на него?

Заранее спасибо!

Последний раз редактировалось vinni, 14.03.2008 в 10:16.
Ответить с цитированием
  #2  
Старый 14.03.2008, 11:27
Аватар для alikoder
alikoder alikoder вне форума
Начинающий
 
Регистрация: 05.12.2007
Сообщения: 126
Репутация: 10
По умолчанию

то есть, на форме, или в самой винде, меню тебе нужно? если на форме то скорее всего юзай PopupMenu и обрабатывай нажатие правой кнопки мыши.
Ответить с цитированием
  #3  
Старый 14.03.2008, 12:41
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

В самом простом варианте - вот так.
Код:
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.
Здесь в начало меню формы добавляется пункт "About" и отделяется чертой. Есть еще функция AppendMenu, она совсем простая, но она добавляет только в конец меню. С ней выглядело бы так:
Код:
AppendMenu(Menu, MF_STRING, SC_ABOUT, 'About');

Если вы хотите добавить подменю, то нужно его предварительно создать и указать его дескриптор в поле hSubMenu структуры TMenuItemInfo. Ну и флаги другие, конечно, выставить в fMask (MIIM_SUBMENU). Меню создается функцией CreateMenu

Последний раз редактировалось Rosenkrantz, 14.03.2008 в 12:44.
Ответить с цитированием
  #4  
Старый 14.03.2008, 12:52
vinni vinni вне форума
Начинающий
 
Регистрация: 26.01.2006
Сообщения: 135
Репутация: 10
По умолчанию

Rosenkrantz, спасибо большущее! :-)
Буду пробовать :-)
Ответить с цитированием
  #5  
Старый 14.03.2008, 14:29
vinni vinni вне форума
Начинающий
 
Регистрация: 26.01.2006
Сообщения: 135
Репутация: 10
По умолчанию

Rosenkrantz, все норм, но нужно чтобы этот пункт меню добавлялся при правом клике не на мое приложение, а на заголовке окна ЛЮБОГО приложения :-)
Т.е., например, я запустил свою прогу (она свернута в трее), тыкаю правой на заголовке окна, например, MS Word или MS Excel, и там должен появиться (кроме стандартных) мой пункт меню (раскрывающееся подменю).
Ответить с цитированием
  #6  
Старый 15.03.2008, 11:48
Rosenkrantz Rosenkrantz вне форума
Активный
 
Регистрация: 04.12.2007
Адрес: Москва
Сообщения: 234
Версия Delphi: Delphi 7
Репутация: 40
По умолчанию

Вот в этом вызове
Код:
Menu := GetSystemMenu(Handle, False);
Handle - дескриптор окна, системное меню которого, вы хотите поменять. В моем примере это дескриптор формы нашего приложения. Чтобы добраться до меню чужого окна, очевидно сначала нужно получить его дескриптор. Т.е. запустившись, ваша программа должна найти окна всех открытых приложений и добавить в их системное меню ваш пункт.

Для этого можете использовать EnumWindows. Эта функция находит все окна приложений (но не находит их дочерние окна! для этого есть EnumChildWindows). Вот тут пример использования.

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

Первый вариант - повесить глобальный хук. Посмотрите описание функции SetWindowsHookEx. Обратите внимание - глобальный хук обязательно должен находиться в DLL.

Либо можно просто периодически повторять перебор всех открытых окон и проверять - есть у них в меню ваш пункт или нет. Если нет, добавлять. В конце концов, мало кто, запустив приложение, сразу лезет в его системное меню. Запуская раз в 2-3 секунды перебор окон, вы свою задачу решите. Нужно только подобрать интервал, чтобы сильно не грузило систему.

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

Последний раз редактировалось Rosenkrantz, 15.03.2008 в 15:46.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:16.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter