Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

Опять про пункт меню...   Найти похожие ветки 

 
**Сергей**   (2006-02-06 15:14) [0]

Я тут уже задавал вопрос по поводу добавления нового пункта в контектное меню Windows, нашел на этом форуме этот код:

unit ContextM;

interface

uses
Windows, ActiveX, ComObj, ShlObj;

type
TContextMenu = class(TComObject, IShellExtInit, IContextMenu)
private
  FFileName: array[0..MAX_PATH] of Char;
  TmpFileNames:String;
protected
  { IShellExtInit }
  function IShellExtInit.Initialize = SEIInitialize;
  function SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
    hKeyProgID: HKEY): HResult; stdcall;
  { IContextMenu }
  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;

resourcestring
IDC_TEST1 = "Тестовая строка номер 1";
IDC_TEST2 = "Тестовая строка номер 2";

const
Class_ContextMenu: TGUID = "{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}";

//var Params: String;

implementation

uses ComServ, SysUtils, ShellApi, Registry, Graphics;

// Тут наше меню инициализируется
// на вход приходит интерфейс IDataObject из которого мы можем получить
// список файлов и папок над которыми будут происходить действия
function TContextMenu.SEIInitialize(pidlFolder: PItemIDList; lpdobj: IDataObject;
hKeyProgID: HKEY): HResult;
var
StgMedium: TStgMedium;
FormatEtc: TFormatEtc;
FilesCount,I:Integer;
begin

if (lpdobj = nil) then
begin
  Result := E_INVALIDARG;
  Exit;
end;

with FormatEtc do begin
  cfFormat := CF_HDROP;
  ptd      := nil;
  dwAspect := DVASPECT_CONTENT;
  lindex   := -1;
  tymed    := TYMED_HGLOBAL;
end;

Result := lpdobj.GetData(FormatEtc, StgMedium);
if Failed(Result) then Exit;

TmpFileNames := "";
FilesCount := DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0);
for I:= 0 to FilesCount - 1 do
begin
  DragQueryFile(StgMedium.hGlobal, I, FFileName, SizeOf(FFileName));
  TmpFileNames := TmpFileNames + """+FFileName+"" ";
end;
Result := NOERROR;
ReleaseStgMedium(StgMedium);
end;

// Создание меню
// по этому событию мы добавляем новые элементы меню...
function TContextMenu.QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,
        idCmdLast, uFlags: UINT): HResult;
begin
Result := MakeResult(SEVERITY_SUCCESS, FACILITY_NULL, 0);

if ((uFlags and $0000000F) = CMF_NORMAL) or
   ((uFlags and CMF_EXPLORE) <> 0) then
begin
  // Разделитель
  InsertMenu(Menu, indexMenu, MF_SEPARATOR or MF_BYPOSITION, 0, nil);
  // первый пункт меню
  InsertMenu(Menu, indexMenu + 1, MF_STRING or MF_BYPOSITION, idCmdFirst,
    PChar(IDC_TEST1));
  // второй пункт меню
  InsertMenu(Menu, indexMenu + 2, MF_STRING or MF_BYPOSITION, idCmdFirst + 1,
    PChar(IDC_TEST2));
  // разделитель
  InsertMenu(Menu, indexMenu + 3, MF_SEPARATOR or MF_BYPOSITION, 0, nil);
  // указываем сколько пунктов меню мы добавили
  // 2 пункта - т.к. разделители не считаются
  Result := MakeResult(SEVERITY_SUCCESS, FACILITY_NULL, 2);
end;
end;

// данная функция срабатывает при нажатии на наш элемент меню
function TContextMenu.InvokeCommand(var lpici: TCMInvokeCommandInfo): HResult;
begin
Result := E_FAIL;
if (HiWord(Integer(lpici.lpVerb)) <> 0) then Exit;
Result := NOERROR;
// Выбор элементов меню идет по возрастающей в том порядке
// в каком они были добавлены
case LoWord(lpici.lpVerb) of
0: // первый элемент меню
   // тут собственно и нужно делать реакцию на нажатие ;)
  MessageBox(lpici.hWnd, PChar(TmpFileNames), PChar(IDC_TEST1 + " Pressed"), MB_OK);
1: // второй элемент меню
  MessageBox(lpici.hWnd, PChar(TmpFileNames), PChar(IDC_TEST2 + " Pressed"), MB_OK);
else
  Result := E_INVALIDARG;
end;
end;

// Данная функция вызывается когда статус бар в эксплорере активен
// и в нем отображается краткая информация о подсвеченном пункте меню
function TContextMenu.GetCommandString(idCmd, uType: UINT; pwReserved: PUINT;
pszName: LPSTR; cchMax: UINT): HRESULT;
begin
Result := S_OK;
if uType = GCS_HELPTEXT then
  case idCmd of
    0:
    begin
      StrCopy(pszName, "Справочная информация по первому пункту меню");
    end;
    1:
    begin
      StrCopy(pszName, "Справочная информация по второму пункту меню");
    end
    else
      Result := E_INVALIDARG
  end
end;

type
TContextMenuFactory = class(TComObjectFactory)
public
  procedure UpdateRegistry(Register: Boolean); override;
end;

// Это процедура которая будет выполнятся при вызове библиотеки из командной строки
// regsvr32   C:\CONTMENU.dll  - регистрация библиотеки
// regsvr32   C:\CONTMENU.dll -unregister - снятие библиотеки с регистрации
procedure TContextMenuFactory.UpdateRegistry(Register: Boolean);
var
ClassID: string;
begin
if Register then
begin
  inherited UpdateRegistry(Register);

  ClassID := GUIDToString(Class_ContextMenu);
  CreateRegKey("Test\shellex", "", "");
  CreateRegKey("Test\shellex\ContextMenuHandlers", "", "");
  CreateRegKey("Test\shellex\ContextMenuHandlers\ContMenu", "", ClassID);

  if (Win32Platform = VER_PLATFORM_WIN32_NT) then
    with TRegistry.Create do
    try
      RootKey := HKEY_LOCAL_MACHINE;
      OpenKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions", True);
      OpenKey("Approved", True);
      WriteString(ClassID, "Test Context Menu Shell Extension");
    finally
      Free;
    end;
end
else
begin
  DeleteRegKey("Test\shellex\ContextMenuHandlers\ContMenu");
  DeleteRegKey("Test\shellex\ContextMenuHandlers");
  DeleteRegKey("Test\shellex");
  inherited UpdateRegistry(Register);
end;
end;

initialization
TContextMenuFactory.Create(ComServer, TContextMenu, Class_ContextMenu,
  "", "Test Context Menu Shell Extension", ciMultiInstance,
  tmApartment);
end.

Скомпилил как DLL, зарегил через regsvr32, но нового пункта так и не нашел! ОС WinXP, Delphi2005
Может есть специальный компонент? Мне бы хотя бы название...

И еще, можно ли как нибуть узнать полный путь к выбранной в Explore папке?


 
ZeroDivide ©   (2006-02-06 15:35) [1]

http://rivstech.ru/stats/index.php?aid=102



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
15-1139141441
alexsis
2006-02-05 15:10
2006.02.26
Пара вопросов имеется


2-1139053550
nap<>
2006-02-04 14:45
2006.02.26
документооборот


15-1138667087
Petr V. Abramov
2006-01-31 03:24
2006.02.26
Россияне не должны стать ИТ-батраками


15-1139204810
Ega23
2006-02-06 08:46
2006.02.26
С Днём рождения! 4 февраля


1-1137951205
jjj
2006-01-22 20:33
2006.02.26
замена библиотек





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский