[Notes2-team] =?iso-8859-1?Q?Re:_=5BNotes2-team=5D_Re:_=5BNotes2-team=5D_Uma_=FAltima?= =?iso-8859-
Brought to you by:
andersonrb
From: Daniel R. <dan...@ya...> - 2003-12-02 10:26:26
|
Segue o c=F3digo completo do Shell at=E9 o momento, mas queria que = voc=EAs conseguissem botar a fun=E7=E3o pra trabalhar sozinha hehehe... = ela tem que colocar texto na =E1rea de transfer=EAncia independente do = restante do c=F3digo. Vale lembrar mais uma vez: n=E3o pode usar a unit Clipbrd.. :) Any help, please! []=B4s Daniel Roma #Equipe do Notes - Desenvolvimento unit uNotesShellExt; interface uses Windows, ActiveX, ComObj, ShlObj, Graphics, Classes; type TContextMenu =3D class(TComObject, IShellExtInit, IContextMenu) private fFileName: array[0..MAX_PATH] of Char; NotesIcon: TBitMap; OpenIcon: TBitMap; WWWIcon: TBitMap; CopyIcon: TBitMap; SaveIcon: TBitMap; MakeIcon: TBitMap; FavIcon: TBitMap; AboutBitMap: TBitMap; protected //Inicializa=E7=E3o do Shell Extension function IShellExtInit.Initialize =3D SEIInitialize; function SEIInitialize(pidlFolder: PItemIDList; lpdobj: = IDataObject;hKeyProgID: HKEY): HResult; stdcall; //Menu de Contexto do Explorer 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; const Class_ContextMenu: TGUID =3D '{173A3318-80D5-41A2-9CC6-DABEB299181D}'; implementation {$R NotesShell.res} uses ComServ, SysUtils, ShellApi, Registry; function GetNotesPath(aFile:String): string; // Esta fun=E7=E3o retorna o caminho para o execut=E1vel do Notes... =E9 = um dos pontos // onde =E9 necess=E1rio usar o Registro do Windows var Reg: TRegistry; begin Reg :=3D TRegistry.Create; try with Reg do begin RootKey :=3D HKEY_LOCAL_MACHINE; if OpenKey('\SOFTWARE\Equipe do Notes\NotesSE2004', False) then = //Segundo a chave sugerida pelo Anderson Result :=3D ExpandFileName(ReadString('RootDir') + aFile) // = Retorna o path mais o nome do arquivo passado como par=E2metro else Result :=3D ''; //retorna vazio caso a chave n=E3o exista end; if AnsiPos(' ', Result) <> 0 then // caso existam espa=E7os no = path... Result :=3D ExtractShortPathName(Result); // Converte o resultado = para o formato 8.3 para manter compatibilidade com qquer sistema finally Reg.Free; end; end; //fun=E7=E3o que carrega um BitMap a partir do Resource, redimensionando = pro sistema do usu=E1rio procedure fLoadImage(out aBitMap: TBitMap;aResourceName:String); var tmpBitMap: TBitMap; userBitMapSize: integer; begin if aBitMap =3D nil then begin tmpBitMap :=3D TBitmap.Create; userBitMapSize :=3D GetSystemMetrics(SM_CXMENUCHECK); try tmpBitMap.LoadFromResourceName(hInstance,aResourceName); aBitMap :=3D TBitmap.Create; aBitMap.Width :=3D userBitMapSize; aBitMap.Height :=3D userBitMapSize; = aBitMap.Canvas.StretchDraw(rect(0,0,userBitMapSize,userBitMapSize),tmpBit= Map); finally tmpBitMap.Free; end; end; end; //%$&=A8%#&=A8% de fun=E7=E3o que n=E3o funciona!!! procedure SetClipboardText(aText:PChar); var Data: THandle; DataPtr: Pointer; begin OpenClipboard(GetDesktopWindow); try Data :=3D GlobalAlloc(GMEM_MOVEABLE+GMEM_DDESHARE, length(aText)); try DataPtr :=3D GlobalLock(Data); try Move(aText^, DataPtr^, length(aText)); EmptyClipboard; SetClipboardData(CF_TEXT, Data); finally GlobalUnlock(Data); end; except GlobalFree(Data); raise; end; finally CloseClipboard; end; end; function TContextMenu.SEIInitialize(pidlFolder: PItemIDList; lpdobj: = IDataObject; hKeyProgID: HKEY): HResult; var StgMedium: TStgMedium; FormatEtc: TFormatEtc; begin if (lpdobj =3D nil) then begin Result :=3D E_INVALIDARG; Exit; end; with FormatEtc do begin cfFormat :=3D CF_HDROP; ptd :=3D nil; dwAspect :=3D DVASPECT_CONTENT; lindex :=3D -1; tymed :=3D TYMED_HGLOBAL; end; fLoadImage(NotesIcon,'NotesIcon'); fLoadImage(OpenIcon,'OpenIcon'); fLoadImage(WWWIcon,'WWWIcon'); fLoadImage(CopyIcon,'CopyIcon'); fLoadImage(SaveIcon,'SaveIcon'); fLoadImage(MakeIcon,'MakeIcon'); fLoadImage(FavIcon,'FavIcon'); // Abaixo, =E9 criado um BitMap para ser colocado no meio do menu... // fiz esse trecho mais para demonstrar o que d=E1 pra fazer, n=E3o = sei se vai // ser usado. if AboutBitMap =3D nil then begin AboutBitMap :=3D TBitmap.Create; AboutBitMap.Width :=3D 165; AboutBitMap.Height :=3D 15; AboutBitMap.Canvas.Brush.Color :=3D clCream; AboutBitMap.Canvas.Pen.Color :=3D clBlue; AboutBitMap.Canvas.Rectangle(0,0,165,15); AboutBitMap.Canvas.Font.Color :=3D clNavy; AboutBitMap.Canvas.TextOut(7,1,'HomePage do Notes SE 2004'); end; Result :=3D lpdobj.GetData(FormatEtc, StgMedium); if Failed(Result) then Exit; // Os c=F3digos que eu estudei permitem o tratamento de apenas um = arquivo por vez. // Assim, caso s=F3 um arquivo esteja selecionado, ele passa o nome do = mesmo para fFileName // Caso Contr=E1rio, ele nem chega a chamar o pop-up do Notes. if (DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0) =3D 1) then = begin DragQueryFile(StgMedium.hGlobal, 0, fFileName, SizeOf(fFileName)); Result :=3D NOERROR; end else begin FFileName[0] :=3D #0; Result :=3D E_FAIL; end; ReleaseStgMedium(StgMedium); end; function TContextMenu.QueryContextMenu(Menu: HMENU; indexMenu, = idCmdFirst, idCmdLast, uFlags: UINT): HResult; var mySub: HMENU; idCmd: Cardinal; begin Result :=3D 0; if ((uFlags and $0000000F) =3D CMF_NORMAL) or ((uFlags and = CMF_EXPLORE) <> 0) then begin idCmd :=3D idCmdFirst; //inicializa o identificador de comando //Editar com o Notes - Posi=E7=E3o inicial (IndexMenu) InsertMenu(Menu, indexMenu, MF_STRING or MF_BYPOSITION,idCmd, = 'Editar com o Notes'); if OpenIcon <> nil then = SetMenuItemBitmaps(Menu,indexMenu,MF_BYPOSITION,OpenIcon.Handle,OpenIcon.= Handle); mySub :=3D CreatePopupMenu; //Cria o menu principal, que abriga os = outros. // Posi=E7=E3o: IndexMenu + 1 InsertMenu(Menu, indexMenu+1, MF_STRING or MF_BYPOSITION or = MF_POPUP, mySub, 'Notes SE 2004'); if NotesIcon <> nil then = SetMenuItemBitmaps(Menu,indexMenu+1,MF_BYPOSITION,NotesIcon.Handle,NotesI= con.Handle); //Coloca o =EDcone do notes ao lado do item //O que est=E1 dentro do mySub begin //Usar como Template do Notes inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Usar como Template do Notes'); if OpenIcon <> nil then SetMenuItemBitmaps(mySub,idCmd - idCmdFirst - = 1,MF_BYPOSITION,OpenIcon.Handle,OpenIcon.Handle); //Salvar como template do Notes inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Salvar como template do Notes'); if SaveIcon <> nil then SetMenuItemBitmaps(mySub,idCmd - idCmdFirst - = 1,MF_BYPOSITION,SaveIcon.Handle,SaveIcon.Handle); //-----------------Separador---------------------------- inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_SEPARATOR,0,nil); //Copiar conte=FAdo inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Copiar conte=FAdo'); if CopyIcon <> nil then SetMenuItemBitmaps(mySub,idCmd - idCmdFirst - = 1,MF_BYPOSITION,CopyIcon.Handle,CopyIcon.Handle); //Copiar nome do arquivo inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Copiar nome do arquivo'); if CopyIcon <> nil then SetMenuItemBitmaps(mySub,idCmd - idCmdFirst - = 1,MF_BYPOSITION,CopyIcon.Handle,CopyIcon.Handle); //Informa=E7=F5es do arquivo inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Informa=E7=F5es do arquivo'); //-----------------Separador---------------------------- inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_SEPARATOR,0,nil); //Compilar arquivo inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Compilar arquivo'); if MakeIcon <> nil then SetMenuItemBitmaps(mySub,idCmd - idCmdFirst - = 1,MF_BYPOSITION,MakeIcon.Handle,MakeIcon.Handle); //Comprimir HTML inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Comprimir HTML'); //-----------------Separador---------------------------- inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_SEPARATOR,0,nil); //Adicionar aos favoritos do Notes inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_STRING or = MF_BYPOSITION,idCmd, 'Adicionar aos favoritos do Notes'); if FavIcon <> nil then SetMenuItemBitmaps(mySub,idCmd - idCmdFirst - = 1,MF_BYPOSITION,FavIcon.Handle,FavIcon.Handle); //-----------------Separador---------------------------- inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_SEPARATOR,0,nil); //HomePage do Notes inc(idCmd); InsertMenu(mySub, idCmd - idCmdFirst - 1, MF_BITMAP or = MF_BYPOSITION,idCmd, PChar(AboutBitMap.Handle)); if WWWIcon <> nil then SetMenuItemBitmaps(mySub, idCmd - idCmdFirst - = 1,MF_BYPOSITION,WWWIcon.Handle,WWWIcon.Handle); end; // o valor de retorno deve ser o n=FAmero de menus que foram criados Result :=3D idCmd - idCmdFirst + 1; end; end; function TContextMenu.InvokeCommand(var lpici: TCMInvokeCommandInfo): = HResult; resourcestring sPathError =3D 'Erro ao definir diret=F3rio ativo!'; var PrevDir: string; NotesExe: string; cmdLine: String; begin Result :=3D E_FAIL; // Certifica que =E9 o Explorer que est=E1 acessando a DLL, e n=E3o um = aplicativo qquer if (HiWord(Integer(lpici.lpVerb)) <> 0) then begin Exit; end; NotesExe :=3D GetNotesPath('NotesSE.exe'); if ((NotesExe =3D '') or (not FileExists(NotesExe))) then begin //Chamada abaixo em API, pois tirar o Dialogs.dcu economizou quase = 300kb! MessageBox(GetDesktopWindow,'Notes n=E3o instalado corretamente!' + = #13 + 'Tente instalar novamente por favor.','Erro de = Instala=E7=E3o',MB_OK or MB_ICONERROR); exit; end; cmdLine :=3D ''; case LoWord(Integer(lpici.lpVerb)) of 0: // "Editar com o Notes" cmdLine :=3D NotesExe + ' "' + fFileName + '"'; 1: // "Usar como Template do Notes" cmdLine :=3D NotesExe + ' -t "' + fFileName + '"'; //2: //Salvar como template do Notes //3: -----------------Separador---------------------------- //4: //Copiar conte=FAdo //5: //Copiar nome do arquivo //6: //Informa=E7=F5es do arquivo //7: -----------------Separador---------------------------- //8: //Compilar arquivo //9: //Comprimir HTML //10:-----------------Separador---------------------------- //11://Adicionar aos favoritos do Notes //12:-----------------Separador---------------------------- 13: // "HomePage do Notes" = ShellExecute(GetDesktopWindow,nil,'http://notes.codigolivre.org.br',nil,n= il,SW_MAXIMIZE); end; if cmdLine <> '' then begin PrevDir :=3D GetCurrentDir; try WinExec(PChar(cmdLine), lpici.nShow); Result :=3D NOERROR; finally SetCurrentDir(PrevDir); end; end; end; function TContextMenu.GetCommandString(idCmd, uType: UINT; pwReserved: = PUINT; pszName: LPSTR; cchMax: UINT): HRESULT; begin //Essa fun=E7=E3o descreve o texto da barra de status do explorer case idCmd of 0: // "Editar com o Notes" begin if (uType =3D GCS_HELPTEXT) then StrCopy(pszName, PChar('Edita o arquivo "' + = ExtractFileName(fFileName) + '" com o Notes SE 2004')); Result :=3D NOERROR; end; 1: // "Usar como Template do Notes" begin if (uType =3D GCS_HELPTEXT) then StrCopy(pszName, PChar('Usa o arquivo "' + = ExtractFileName(fFileName) + '" como template com o Notes SE 2004')); Result :=3D NOERROR; end; 3: // "HomePage do Notes SE 2004" begin if (uType =3D GCS_HELPTEXT) then StrCopy(pszName, PChar('HomePage do Notes SE 2004')); Result :=3D NOERROR; end; else Result :=3D E_INVALIDARG; end; end; type TContextMenuFactory =3D class(TComObjectFactory) public procedure UpdateRegistry(Register: Boolean); override; end; procedure TContextMenuFactory.UpdateRegistry(Register: Boolean); var ClassID: string; begin //Registra o Menu de contexto if Register then begin inherited UpdateRegistry(Register); ClassID :=3D GUIDToString(Class_ContextMenu); CreateRegKey('*\shellex', '', ''); CreateRegKey('*\shellex\ContextMenuHandlers', '', ''); CreateRegKey('*\shellex\ContextMenuHandlers\Notes', '', ClassID); if (Win32Platform =3D VER_PLATFORM_WIN32_NT) then with TRegistry.Create do try RootKey :=3D HKEY_LOCAL_MACHINE; OpenKey('SOFTWARE\Microsoft\Windows\CurrentVersion\Shell = Extensions', True); OpenKey('Approved', True); WriteString(ClassID, 'Notes SE 2004 Shell Extension'); finally Free; end; end else begin DeleteRegKey('*\shellex\ContextMenuHandlers\Notes'); DeleteRegKey('*\shellex\ContextMenuHandlers'); DeleteRegKey('*\shellex'); inherited UpdateRegistry(Register); end; end; initialization TContextMenuFactory.Create(ComServer, TContextMenu, = Class_ContextMenu,'', 'Notes SE 2004 Shell Extension', = ciMultiInstance,tmApartment); end. --- Verifica=E7=E3o de V=EDrus executada: Nenhum v=EDrus encontrado! Sudeste Seguran=E7a e Transporte de Valores Departamento de Tecnologia e Informa=E7=F5es Checked by AVG anti-virus system (http://www.grisoft.com). Version: 6.0.545 / Virus Database: 339 - Release Date: 27/11/2003 |