38221

Робота з системним контекстним меню

Лабораторная работа

Информатика, кибернетика и программирование

Дана робота багато в чому нагадує попередню роботу. Вам також потрібно створити власний СОМ-об’єкт, для обробки контекстного меню (системне контекстне меню – це меню, яке випадає при натиску на праву кнопку миші).

Украинкский

2014-11-30

59.5 KB

1 чел.

Лабораторна робота №5

Тема: Робота з системним контекстним меню.

Хід роботи

Дана робота багато в чому нагадує попередню роботу. Вам також потрібно створити власний СОМ-обєкт, для обробки контекстного меню (системне контекстне меню – це меню, яке випадає при натиску на праву кнопку миші).

Отже, так як і в попередній роботі створюємо ActiveX-бібліотеку та СОМ-об’єкт в цій бібліотеці (не називайте об’єкт   ContextMenu – це може призвести до проблем з назвами інтерфейсів). Під’єднайте модулі ShlObj, ShellAPI,  SysUtils, Registry.

Для роботи з меню ваш об’єкт повинен унаслідувати два інтерфейси - IShellExtInit, IContextMenu. З цих двох інтерфейсів вам клас повинен реалізувати чотири методи. Ось так приблизно має виглядати ваш клас:

 TConMenu = class(TTypedComObject, IShellExtInit, IContextMenu)

 protected

   FFileName:array[0..MAX_PATH] of char;

   FMenuIndex:UINT;

   

  function Initialize(pidlFolder: PItemIDList; lpdobj: IDataObject;

     hKeyProgID: HKEY): HResult; stdcall;

  function QueryContextMenu(Menu: HMENU;

      indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): HResult; stdcall;

  function InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult; stdcall;

  function GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;

     pszName: LPSTR; cchMax: UINT): HResult; stdcall;

 end;

Функція Initialize оголошена в інтерфейсі IShellExtInit. Призначена для початкової ініціалізації меню. В основному використовується для визначення файлів, для яких викликане контекстне меню. Нас буде цікавити тільки другий параметр, за допомогою якого можна отримати список файлів. Реалізація даної функції представлена нижче:

function TConMenu.Initialize(pidlFolder: PItemIDList; lpdobj: IDataObject;

 hKeyProgID: HKEY): HResult;

var

Medium:TStgMedium;

FE:TFormatEtc;

begin

// На всяк випадок перевыряємо, чи передано вказівник  

if lpdobj=nil  then

   begin

     Initialize:=E_FAIL;

     exit;

   end;

//Структура запиту

FE.cfFormat:=CF_HDROP;

FE.ptd:=nil;

FE.dwAspect:=DVASPECT_CONTENT;

FE.lindex:=-1;

FE.tymed:=TYMED_HGLOBAL;

lpdobj.GetData(FE,Medium);

if DragQueryFile(Medium.hGlobal,$FFFFFFFF,nil,0)=1 then

  begin

   DragQueryFile(Medium.hGlobal,0,FFileName,sizeof(FFileName));

   Initialize:=NOERROR;

  end else Initialize:=E_FAIL;

    ReleaseStgMedium(medium);

end;

Хоча і здається, що реалізація даної функції складна – насправді все просто. Параметр lpdobj – це вказівник на реалізацію інтерфейса IDataObject, з якого нас цікавить тільки метод GetData. За допомогою даного методу можна отримати вказівник на список файлів. Перший параметр – це структура, яка описує формат запиту(що це таке і з чим його їдять довго описувати – використовуєте такий запис я к і в роботі), а другий  - структура (TStgMedium) в яку повертається опис списку.

Із структури TStgMedium назви файлів вибираються за допомогою функції DragQueryFile. Перший параметр  - ідентифікатор структури, що містить список файлів, другий параметр – номер файлу в списку, третій – вказівник, куди буде повертатись строкове значення назви файлу (рядок має бути описаний як масив символів – опис С++. Тому в класі і описане поле FFileName, як масив символів. Це поле і буде зберігати назву файлу для подальшої роботи). Четвертий параметр – розмір масиву, куди буде записуватись назва файлу. Якщо дану функцію викликати і другий параметр при цьому задати як $FFFFFFFF – то функція повертає к-сть файлів у списку. Як видно з прикладу – ми обробляємо, чи виділений один файл. І наша функція призначена для роботи з одним файлом.

Метод Initialize повинен повертати значення NOERROR якщо помилок немає, або E_FAILв противному випадку. Повернення певних значень – є обов’язковою умовою.

Наступний метод – QueryContextMenu. Призначений для редагування контекстного меню. В даному методі можна додавати нові пункти меню. Реалізація даного методу наступна:

function TConMenu.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,   idCmdLast, uFlags: UINT): HResult;

begin

 FMenuIndex:=indexMenu;

 InsertMenu(Menu,FMenuIndex ,MF_STRING or MF_BYPOSITION, idCmdFirst,Новий пункт…' );

 QueryContextMenu:=FMenuIndex+1;

end;

 

 Перший параметр – це ідентифікатор меню, другий – номер пункту меню(починаючи з нуля), після якого можна вставити власний пункт меню. Третій та четвертий параметри – мінімальне та максимальне значення ідентифікатора даного пункту меню (використовується в основному при створенні підменю) , останній параметр  - це певні флаги.

Індекс меню потрібно зберегти, для подальшого використання. Даний індекс і зберігається в полі FMenuIndex. Вставка власного пункту відбувається за допомогою функції InsertMenu. Перший параметр – це ідентифікатор меню, другий  - номер пункту, після якого новий пункт буде встановлений, третій  - флаги встановлення (використовуйте вказані), четвертий – додаткові параметри (використано мінімальне значення ідентифікатора – хоча в подальшому ми не будемо його обробляти), останній параметр – рядок, що буде доданий в меню. Функція повинна повернути значення на одиницю більше ніж вхідне значення номера пункту меню (вхідний параметр indexMenu).

Далі потрібно реалізувати метод GetCommandString. Ця функція викликається системою при отриманні довідкового рядка, про даний пункт меню. Реалізація наступна:

function TConMenu.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;  pszName: LPSTR; cchMax: UINT): HResult;

begin

// Перевіряємо, чи вибрано наш пункт меню

 if FMenuIndex=idCmd then

  begin

  StrLCopy(pszName,’Новий пункт меню…',cchMax);

  GetCommandString:=S_OK;

  end

   else GetCommandString:=E_INVALIDARG;

end;    

Суть реалізації наступна – у вихідний параметр pszName – потрібно записати значення, яке і буде довідниковим рядком, що і робить функція  StrLCopy. Звичайно потрібно перевірити, чи дійсно вибраний наш пункт меню – для цього потрібно перевірити значення параметра idCmd – в якому зберігається ідентифікатор пункту меню. Функція повинна повернути значення S_OK, при нормальному виконанні, або E_INVALIDARG в противному.

 Остання функція – InvokeCommand, викликається, коли конкретно  вибрано пункт меню. Її реалізація наступна:

function TConMenu.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;

begin

if LoWord(lpici.lpVerb)=FMenuIndex  then

  begin

   // Код виконан, ня пункту меню 

   .

   .

  .

    InvokeCommand:=S_OK;

  end else InvokeCommand:=E_FAIL;

end;

Вхідний параметр тільки один – структура lpici типу TCMInvokeCommandInfo, яка описує системну інформацію при виклику меню. В даній структурі нас цікавить тільки молодше слово поля lpVerb, в якому зберігається номер пункту меню. Його і порівнюємо із значенням, яке зберігається в полі FMenuIndex і описуємо код виконання. Також може бути потрібне значення поля lpici.hWnd вхідної структури. В цьому полі зберігається ідентифікатор меню, і дане значення може бути використане при виклику системних функцій (наприклад – функція показу повідомлення MessageBox. Перший параметр даної функції – ідентифікатор вікна. В якості цього параметра можна використати і значення ідентифікатора меню).

З самим класом все – тепер потрібно лише зареєструвати його в системі. Як і в попередній роботі потрібно створити фабрику класів. В принципі технологія аналогічна попередній роботі лише з деякими змінами. Наш клас потрібно зареєструвати в реєстрі в наступній вітці

HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\

 Якщо зареєструєте клас в даній вітці, то ваш пункт меню буде зявлятись при виклику меню для всіх файлів. Якщо ж замість знаку ‘*’ записати розширення файлу з знаком ‘.’перед ним, то ваш пункт меню буде тільки для файлів з конкретним розширенням. Наприклад, якщо ваш клас зареєстрований в у вітці

HKEY_CLASSES_ROOT\.asm\shellex\ContextMenuHandlers\

то ваш пункт меню буде з’являтись тільки для фалів з розширенням asm.

Фабрика класів оголошена наступним чином:

 TContexMenuFactory=class(TComObjectFactory)

 protected

  function GetProgID:string;override;

  procedure ApproveShellExtension(Register:boolean; const ClsID:string);virtual;

 public

   procedure UpdateRegistry(Register:boolean);override;

 end;

Реалізація даного класу майже однакова з попередньою роботою. Зміни тільки в процедурі UpdateRegistry. Її реалізація наступна

procedure TContexMenuFactory.UpdateRegistry(Register: boolean);

var

Clsid:string;

begin

 Clsid:=GUIDToString(ClassID);

 inherited UpdateRegistry(Register);

 if Register then

   begin

     CreateRegKey('*\shellex\ContextMenuHandlers\'+ClassNAme,'',Clsid);

   end else

   begin

     DeleteRegKey('*\shellex\ContextMenuHandlers\'+ClassNAme);

   end;

end;

Відповідно і виклик даної фабрики ідентичний.

Як і в попередній роботі – на виході в нас отрималась бібліотека динамічного підключення. Її зареєструвати в системі можна, або таким же чином як і в попередній роботі, або за допомогою команди regsvr32 шляхом виклику її з командного рядка. Параметром даної команди є назва DLL-бібліотеки. Для відключення бібліотеки – команда таж сама, з назвою бібліотеки, але з параметром /u.

Завдання:

На 9 балів: Розробити власну бібліотеку, яка додає новий пункт в системне контекстне меню. При натиску на цей пункт виводиться системне вікно з написом «Hello world !!!»

На 10 балів: Аналогічна попередньому завданню, але виводиться назва файлу, для якого визвано контекстне меню.

На 11 балів: Меню реєструється тільки для файлів з розширенням asm. Має додатись пункт – «відкомпілювати». При натиску на цей пункт – має запуститись компілятор та лінкер, для вибраного файлу. Відповідно результат – EXE-файл на виході.


 

А также другие работы, которые могут Вас заинтересовать

27417. Понятие открытого образовательного пространства как пространства субъектного действия. Модульная система оргформ порождения и становления образовательного пространства в области художественного образования 48.5 KB
  Когда мы говорим о пространстве образования то имеем в виду пространство где формируется образ человека его внутренняя форма. Фомина рассматривает образовательное пространство района как систему управления развитием личности. Автор отмечает что образовательное пространство формируется с помощью целого комплекса направлений деятельности. Под образовательным пространством мы понимаем пространственновременное поле функционирования и развития системы образования как открытой и активной социальной сферы в которой действует своя идеология...
27418. Методика обучения основам синтетических видов искусства (9ый класс). Синтетические искусства и изображение (театр, кино, видео, компьютерные экранные технологии, анимация) 60 KB
  Методика обучения основам синтетических видов искусства 9ый класс. Синтетические искусства и изображение театр кино видео компьютерные экранные технологии анимация. Общая характеристика учебного предмета9 клаcc Этот тематический блок представляет собой расширение курса визуальнопластических искусств и осознание их прочной связи с синтетическими искусствами кино телевидение и др. Именно синтетические искусства непосредственно происходящие от изобразительных являются сегодня господствующими во всей системе видеокультуры.
27419. Народная художественная культура национальные, этнические формы искусства. Методы и формы приобщения учащихся к многообразию культурного наследия, к региональным (местным) национальным культурам и искусству на уроках ИЗО и во внеклассной работе 46.5 KB
  Виды и формы ДПИ. Методика обучения основам ДПИ в школе и формах дополнительного образования. ДПИ невозможно без художественного творчества так же как невозможно и без ремесленных основ владения технологией обработки тех или иных материалов. Методика преподавания ДПИ основанного на традиционной народной культуре сравнительно молодой раздел методики преподавания образовательной области Технология .
27420. Особенности методики преподавания искусства в детских художественных школах и школах искусств. Технологии преподавания рисунка, живописи, композиции, скульптуры, ДПИ, истории искусств 89 KB
  первый этап обучения в общеобразовательной школе должен через искусство заложить основы художественного эстетического восприятия явлений окружающей действительности. За четыре года начального обучения необходимо в сознании и эмоциональном развитии ребенка создать фундамент художественных представлений на которые он сможет опираться во всем дальнейшем обучении. Педагог должен с самого начала обучения создавать вокруг темы урока ситуацию уподобления т. ЦЕЛИ:Единство воспитания и образования обучения и творческой деятельности учащихся...
27421. Проектирование, моделирование, исследование и творчество – ведущие способы эффективной деятельности учителя и учащихся 45.5 KB
  Проектирование моделирование исследование и творчество – ведущие способы эффективной деятельности учителя и учащихся. Он формирует опыт деятельности поэтому незаменим. Философия цели и деятельности.Обратите внимание предполагает ли решение проблемы различные виды деятельности изготовление предметов рисунки аппликации записи на плёнку интервью короткую пьесу и.
27422. Методика организации и проведения педагогического эксперимента в области художественного образования/эстетического воспитания и обучения искусству 81.5 KB
  Так имеются методы дидактического воспитательного частнометодического управленческого лабораторного и естественного ограниченного и массового качественного и количественного экспериментов и т. К методам педагогического эксперимента примыкают и взаимопроникают методы психологического физиологического медицинского социологического экономического и других исследований.Внутри эксперимента понимаемого как комплексный метод исследования используются теоретические методы: анализ и синтез индукция и дедукция сравнение аналогия...
27423. Методика обучения конструктивным видам искусства: архитектура и дизайн в жизни человека (8 класс). Интегрированный подход 52.5 KB
  Методика обучения конструктивным видам искусства: архитектура и дизайн в жизни человека 8 класс. Язык этого вида искусства всегда строился и строится на организации пространства здания города села парка и проживания в нём человека. но возникновение этого вида искусства прочно связано с промышленностью с расцветом индустриального производства. Выход за рамки одного искусства одного предмета.
27424. История художественного образования.Обучение искусству в древних цивилизациях:Др.Египет, др.Греция, Античный Рим 48 KB
  Общеобразовательная система художественного образования строилось на обучении рисунку так как написание иероглифов требовало определенных навыков. Система образования имела строгие требования к дисциплине. Система художественного образования в Древней Греции.
27425. Обучение искусству в эпоху Средневековья. Зависимость образовательность моделей с существующими в данной формации духовным (религиозным) идеалом и назначением человека.Школа-монастырь.Методы обучения рисованию в Древней Руси 34 KB
  Методы обучения рисованию в Древней Руси. Основа обучения в этот период – механическое копирование. Итак в эпоху средневековья: основной метод обучения – копирование по образцам способствовавшее развитию ремесленного труда; процесс обучения – самостоятельная работа в составе артели мастеров. службы школыобщежития для подготовки мальчиков к монашеству школы обучения грамоте и церков.