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

Вниз

Как добавить свое меню в проводник   Найти похожие ветки 

 
OlegM   (2006-08-24 06:32) [0]

Например как делает это WinRAR


 
PSPF2003 ©   (2006-08-24 09:12) [1]

Sendtoweb.dpr
========================
// This COM server defines a Context Menu shell extension.  This allows the user
// to right click on Delphi Project files (.DPR) from the Explorer and compile
// them using the DCC32.exe command line compiler.
library ContMenu;
uses
 ComServ,
 Sendtoweb in "Sendtoweb.pas";
exports
 DllGetClassObject,
 DllCanUnloadNow,
 DllRegisterServer,
 DllUnregisterServer;
begin
end.

Sendtoweb.pas
====================
unit Sendtoweb;
// Author C Pringle Cjpsoftware.com
{ Реализация COM объекта расширения оболочки Windows Explorer. Этот
 COM объект способен перенаправлять запросы компоненту TPopupMenu. Компонент   TPopupMenu должен находиться  на форме MenuComponentForm.
 Вы можете модернизировать код для большей гибкости.
 Компонент TContextMenu регистрируется как  глобальным обработчик контекстного меню.
 Это достигается модификацией ключа реестра  
 HKEY_CLASSES_ROOT\*\ShellEx\ContextMenuHandlers.
 jfl
}

interface

uses

Classes, ComServ, ComObj, ActiveX, Windows, ShlObj,  Menus,
   ShellAPI, SysUtils,registry;

type
 TContextMenuFactory = class( TComObjectFactory )
 public
   procedure UpdateRegistry( Register: Boolean ); override;
 end;
 TContextMenu = class( TComObject, IShellExtInit, IContextMenu )
 private
//    FFileName: String;
   function BuildSubMenu( Menu: HMENU; IndexMenu: Integer;
     var IDCmdFirst: Integer ): HMENU;
 protected
   szFile: array[0..MAX_PATH] of Char;
   // Необходимо для исключения предупреждения компилятора о неоднозначности
   function IShellExtInit.Initialize = IShellExtInit_Initialize;
 public
   { IShellExtInit }
   function IShellExtInit_Initialize(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;

var
 // Должен быть инициализирован перед регистрацией TContextMenu!
 GFileExtensions: TStringList;

const
 MenuCommandStrings: array[ 0..3 ] of String = (
   "-","D:\","Borland","Program Files"
);

const
 Class_ContextMenu: TGUID = "{2D782E1B-A136-4D89-8B4A-1571E5386078}";
implementation

Function ReadDefaultPAth: String;
var
 path : String;
 Reg : TRegistry;
begin
 Reg := TRegistry.CReate;
 try
   With Reg Do Begin
     RootKey := HKEY_LOCAL_MACHINE;
     Path := "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths";
     If KeyExists(Path) Then Begin
        OpenKey(Path+"\Sendtoweb.dll",false);
        Result := ReadString(#0);
        closekey;
      End; // Ключ добавлен в реестр.
    End;
  Finally
    Reg.CloseKey;
    Reg.Free;
  End;
End;// Код регистрации

procedure TContextMenuFactory.UpdateRegistry( Register: Boolean );
begin
 inherited UpdateRegistry( Register );
 // Регистрация нашего обработчика
 if Register then begin
   CreateRegKey( "*\ShellEx\ContextMenuHandlers\SendToWeb", "", GUIDToString( Class_ContextMenu ) );
   CreateRegKey( "CLSID\" + GUIDToString( ClassID ) + "\" + ComServer.ServerKey, "ThreadingModel", "Apartment" );
 end
 else begin
   DeleteRegKey( "*\ShellEx\ContextMenuHandlers\SendToWeb" );
 end;
end;

{ Построение контекстного меню с использованием хэндла существующего меню.   Если Menu =  nil, мы создаем новый хэндл меню и возвращаем его как результат функции.
 Заметьте, что обработчик не поддерживаетвложенные (рекурсивные)
 меню. }
function TContextMenu.BuildSubMenu( Menu: HMENU; IndexMenu: Integer;
 var IDCmdFirst: Integer ): HMENU;
var
 i: Integer;
 menuItemInfo: TMenuItemInfo;
begin
 if Menu = 0 then
   Result := CreateMenu
 else
   Result := Menu;
 // Подготавливаем меню
 with menuitemInfo do begin
   cbSize          := SizeOf( TMenuItemInfo );
   fMask           := MIIM_CHECKMARKS or MIIM_DATA or MIIM_ID or MIIM_STATE or MIIM_SUBMENU or MIIM_TYPE or MIIM_CHECKMARKS ;
   fType           := MFT_STRING;
   fState          := MFS_ENABLED ;
   hSubMenu        := 0;
   hbmpChecked     := 0;
   hbmpUnchecked   := 0;
 end;

 for i := 0 to High( MenuCommandStrings ) do begin
   if i = 0 then
     menuitemInfo.fType := MFT_SEPARATOR
   else
     menuiteminfo.ftype := MFT_String;
   if i = 1 then
     menuitemInfo.fstate := MFS_ENABLED OR MFS_DEFAULT
   Else
     menuitemInfo.fstate := MFS_ENABLED;

   menuitemInfo.dwTypeData := PChar(MenuCommandStrings[ i ]);
   menuitemInfo.wID := IDCmdFirst;
   InsertMenuItem( Result, IndexMenu + i, True, menuItemInfo );
   Inc( IDCmdFirst );
 end;
end;

function TContextMenu.IShellExtInit_Initialize( pidlFolder: PItemIDList;
 lpdobj: IDataObject; hKeyProgID: HKEY ): HResult;
var
 medium: TStgMedium;
 fe: TFormatEtc;


 
PSPF2003 ©   (2006-08-24 09:12) [2]

begin
 with fe do begin
   cfFormat := CF_HDROP;
   ptd := Nil;
   dwAspect := DVASPECT_CONTENT;
   lindex := -1;
   tymed := TYMED_HGLOBAL;
 end;
 // Ошибка, если  lpdobj = Nil.
 if lpdobj = Nil then begin
   Result := E_FAIL;
   Exit;
 end;
 Result := lpdobj.GetData(fe, medium);
 if Failed(Result) then Exit;
 // Если выбран только один файл, получаем его имя и сохраняем в  
 // szFile. иначе - ошибка.
 if DragQueryFile(medium.hGlobal, $FFFFFFFF, Nil, 0) = 1 then begin
   DragQueryFile(medium.hGlobal, 0, szFile, SizeOf(szFile));
   Result := NOERROR;
 end
 else
   Result := E_FAIL;
 ReleaseStgMedium(medium);
end;

function TContextMenu.QueryContextMenu( Menu: HMENU;
 indexMenu, idCmdFirst, idCmdLast, uFlags: UINT ): HResult;
var
//  extension:      String;
// I: Integer;
 idLastCommand:  Integer;
begin
 Result := E_FAIL;
 idLastCommand := idCmdFirst;
 // Получаем расширение файла и определяем, есть ли для него
 // зарегистрированный обработчик
 //  extension := UpperCase( ( FFileName ) );
 //for i := 0 to GFileExtensions.Count - 1 do
 //   if Pos(Lowercase(GFileExtensions[ i ]),lowercase(extension))=0 then
 //  begin
 BuildSubMenu( Menu, indexMenu, idLastCommand );
 // Return value is number of items added to context menu
 Result := idLastCommand - idCmdFirst;
 //      Exit;
 //    end;
end;

function TContextMenu.InvokeCommand( var lpici:
 TCMInvokeCommandInfo ): HResult;
var
 idCmd: UINT;
begin
 if HIWORD( Integer(lpici.lpVerb) ) <> 0 then
   Result := E_FAIL
 else begin
   idCmd := LOWORD( lpici.lpVerb );
   Result := S_OK;
   // Активизация диалога и подготовка к послке данных в Web
   case idCmd of
     1 : Begin
       ShellExecute( GetDesktopWindow, nil,Pchar("d:"), nil, nil, SW_SHOW );
     End;
     3 : Begin
       ShellExecute( GetDesktopWindow, nil,Pchar("D:\Program Files"),
         nil, nil, SW_SHOW );
     End;
     2 : ShellExecute( GetDesktopWindow, nil,Pchar("D:\Program Files\Borland\Delphi7"),
         nil, nil, SW_SHOW );
     else
       Result := E_FAIL;
     end;
 end;
end;

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

begin
//  StrCopy( pszName, "Send To The Web") ;
 Result := S_OK;
end;

initialization
 { Заметьте, что в данном фрагменте мы создаем экземпляр TContextMenuFactory,     а не TComObjectFactory. }
 TContextMenuFactory.Create( ComServer, TContextMenu, Class_ContextMenu,
   "ContextMenu", "Send To The Web", ciMultiInstance );

 // Инициализируем список расширений
 GFileExtensions := TStringList.Create;
// GFileExtensions.Add( "setup msn" );

finalization
 GFileExtensions.Free;
 
end.


 
Ketmar ©   (2006-08-24 09:58) [3]

слушай, а зачем такие цитаты? может, просто в каталог с демками посылать? %-)


 
tButton ©   (2006-08-24 10:01) [4]

// предвкушаю вопрос "а как его теперь оттуда убрать?"


 
PSPF2003 ©   (2006-08-24 10:22) [5]


> Ketmar

Я не помню в каком каталоге она находится :


 
Anatoly Podgoretsky ©   (2006-08-24 11:29) [6]

PSPF2003 ©   (24.08.06 10:22) [5]
Demos



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

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

Наверх





Память: 0.48 MB
Время: 0.042 c
2-1156386753
OlegM
2006-08-24 06:32
2006.09.17
Как добавить свое меню в проводник


3-1152870911
syte_ser78
2006-07-14 13:55
2006.09.17
Колво видимых столбцов ДБГрида


2-1156513884
XTD
2006-08-25 17:51
2006.09.17
Как найти нужное мне слово в (TStrings)?


2-1156851094
Percent
2006-08-29 15:31
2006.09.17
DataModule и иже с ним...


2-1156418132
Hadroran
2006-08-24 15:15
2006.09.17
Другая форма на компоненте Panel





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский