[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 |