Paulo Nobre Postado Junho 24, 2006 Denunciar Share Postado Junho 24, 2006 Prezados colegas, num outro forum, um colega deu como dica, para colocar um atalho do programa na barra de inicialização rápida o uso do código abaixo:unit UQLaunch;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Registry, ActiveX, ComObj, ShlObj, StdCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; type ShortcutType=(_DESKTOP, _QUICKLAUNCH, _SENDTO, _STARTMENU, _OTHERFOLDER);var Form1: TForm1;implementationfunction CreateShortcut(SourceFileName: string; // the file the shortcut points to Location: ShortcutType; // shortcut location SubFolder, // subfolder of location WorkingDir, // working directory property of the shortcut Parameters, Description: string): // description property of the shortcut string;const SHELL_FOLDERS_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\Explorer'; QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\GrpConv';var MyObject: IUnknown; MySLink: IShellLink; MyPFile: IPersistFile; Directory, LinkName: string; WFileName: WideString; Reg: TRegIniFile;begin MyObject := CreateComObject(CLSID_ShellLink); MySLink := MyObject as IShellLink; MyPFile := MyObject as IPersistFile; MySLink.SetPath(PChar(SourceFileName)); MySLink.SetArguments(PChar(Parameters)); MySLink.SetDescription(PChar(Description)); LinkName := ChangeFileExt(SourceFileName, '.lnk'); LinkName := ExtractFileName(LinkName); // Quicklauch if Location = _QUICKLAUNCH then begin Reg := TRegIniFile.Create(QUICK_LAUNCH_ROOT); try Directory := Reg.ReadString('MapGroups', 'Quick Launch', ''); finally Reg.Free; end; end else // Other locations begin Reg := TRegIniFile.Create(SHELL_FOLDERS_ROOT); try case Location of _OTHERFOLDER : Directory := SubFolder; _DESKTOP : Directory := Reg.ReadString('Shell Folders', 'Desktop', ''); _STARTMENU : Directory := Reg.ReadString('Shell Folders', 'Start Menu', ''); _SENDTO : Directory := Reg.ReadString('Shell Folders', 'SendTo', ''); end; finally Reg.Free; end; end; if Directory <> '' then begin if (SubFolder <> '') and (Location <> _OTHERFOLDER) then WFileName := Directory + '\' + SubFolder + '\' + LinkName else WFileName := Directory + '\' + LinkName; if WorkingDir = '' then MySLink.SetWorkingDirectory(PChar(ExtractFilePath(SourceFileName))) else MySLink.SetWorkingDirectory(PChar(WorkingDir)); MyPFile.Save(PWChar(WFileName), False); Result := WFileName; end;end;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var PROGRAMA:String;begin PROGRAMA := ExtractFileDir(Application.ExeName)+ExtractFileName(Application.exename); //Create a Shortcut in the Quckick launch toolbar CreateShortcut(PROGRAMA, _QUICKLAUNCH, '','','','Teste de uso da QuickLaunch'); Showmessage('teste');end;end.A função aparece bem grande pois tem a opção de se colocar atalho no desktop, menu iniciar e outros.Para mim só interessou colocar atalho na quick launch.Porém, nada acontece.Alguém poderia analisar este código e consertá-lo.Pro meu nível de conhecimento ele está um pouco avançado. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Junho 25, 2006 Autor Denunciar Share Postado Junho 25, 2006 Como não onsigo de jeito nenhum...Tentei olhar a chave de registro onde tem 'MapGroups', 'QuickLaunch', mas não cheguei a nenhuma conclusão. Infelizmente continuo a ficar sem saber como colocar um atalho lá satisfatoriamente.Digo satisfatoriamente pois uma maneira não boa (quebra galho) é colocando uma cópia do executavelem: C:\Documents and Settings\Proprietário\Dados de aplicativos\Microsoft\Internet Explorer\Quick Launch.É lá que ficam os atalhos que aparecem na tal barra.A parte C:\Documents and Settings\Proprietário que pode variar de computador para computador pegamos via registro na string appDado do shellfolder.Depois uso a função copyfile.Porém, o que vai é uma cópia do executável e não sei colocar um atalho lá.Alguém saberia dizer como copiar uma atalho(que funcione), digo isto pois não adinta só colocar a extensão lnk. Creio que a função que coloquei acima faça isto mais não entendi a fundo como ela funciona. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Graymalkin Postado Junho 26, 2006 Denunciar Share Postado Junho 26, 2006 Isso não deveria ser feito durante a instalação do programa? Se for o caso, o InnoSetup faz isso para você.Abraços,Graymalkin Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Junho 26, 2006 Autor Denunciar Share Postado Junho 26, 2006 Olá, GraymalkinCostumo, em alguns programas, colocar isto(junto com outras possibilidades;atalho no desktop , no menu programas etc...) como opção para o usuário.Gosto de fazer assim, pois embora alguns programas forneçam estas opções, se o usuário deletar os atalhos e depois resolver colocá-los teriam a opção.Eu uso o installshield profissional, não conheço(de usar) o InnoSetup.Alguém disse, num outro forum, que a solução que os outros estão usando é mais ou menos a que estou usando acima. Não acredito muito nisso, mas fazer o que né!!AbraçosPaulo Nobre Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Junho 26, 2006 Denunciar Share Postado Junho 26, 2006 Olá Paulo, tente trocar:QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\GrpConv';por:QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\Explorer';eDirectory := Reg.ReadString('MapGroups', 'Quick Launch', '');porDirectory := Reg.ReadString('Shell Folders', 'AppData', '')+'\Microsoft\Internet Explorer\Quick Launch'; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Junho 27, 2006 Autor Denunciar Share Postado Junho 27, 2006 Olá, s3cMuito obrigado pela dica, funcionou, apenas com um detalhe, que não sei explicar:UsandoDirectory := Reg.ReadString('Shell Folders', 'AppData', '')+'\Microsoft\Internet Explorer\Quick Não funcionou, aí troquei Reg.ReadString('Shell Folders', 'AppData', '') pela string caminho, onde caminho:= reg.ReadString(AppData) e funcionou.(claro que abrindo a chave etc, etc..)Estranho, pois na realidade a idéia é a mesma; pegar o caminho da pasta.Aproveitando o espaço, você poderia dizer porque tanto faz usar:ExtractFilePath(Application.exename) + ExtractFileName(Application.exename) ouExtractFilePath(Application.exename) + '\' +ExtractFileName(Application.exename) ? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 s3c Postado Junho 27, 2006 Denunciar Share Postado Junho 27, 2006 Não sei se foi erro de digitação, mas não é:Directory := Reg.ReadString('Shell Folders', 'AppData', '')+'\Microsoft\Internet Explorer\Quick e sim:Directory := Reg.ReadString('Shell Folders', 'AppData', '')+'\Microsoft\Internet Explorer\Quick Launch';Bom, em todo o caso acho melhor ler o conteúdo de 'AppData' na chave 'Shell Folders' porque de um S.O. para outro pode mudar.Nunca utilizei o TRegIniFile e sim o TRegistry onde você informa a RootKey := HKEY_LOCAL_MACHINE para depois ler as chaves Software\Microsoft\. . .; não sei se é o caso da RootKey de TRegIniFile ser diferente.Quanto aos Extracts, acho que utilizando somente o Application.Exename, deve funcionar porque ele traz o caminho completo do executável. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Junho 28, 2006 Autor Denunciar Share Postado Junho 28, 2006 Ok, s3c,Também nunca usei TRegIniFile e sim o TRegistry.O que importa é que com a sua dica passou a funcionar.Obrigado por mais uma. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Paulo Nobre
Prezados colegas, num outro forum, um colega deu como dica, para colocar um atalho do programa na barra de inicialização rápida o uso do código abaixo:
unit UQLaunch;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
Registry,
ActiveX,
ComObj,
ShlObj, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
ShortcutType=(_DESKTOP, _QUICKLAUNCH, _SENDTO, _STARTMENU, _OTHERFOLDER);
var
Form1: TForm1;
implementation
function CreateShortcut(SourceFileName: string; // the file the shortcut points to
Location: ShortcutType; // shortcut location
SubFolder, // subfolder of location
WorkingDir, // working directory property of the shortcut
Parameters,
Description: string): // description property of the shortcut
string;
const
SHELL_FOLDERS_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\Explorer';
QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\GrpConv';
var
MyObject: IUnknown;
MySLink: IShellLink;
MyPFile: IPersistFile;
Directory, LinkName: string;
WFileName: WideString;
Reg: TRegIniFile;
begin
MyObject := CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;
MySLink.SetPath(PChar(SourceFileName));
MySLink.SetArguments(PChar(Parameters));
MySLink.SetDescription(PChar(Description));
LinkName := ChangeFileExt(SourceFileName, '.lnk');
LinkName := ExtractFileName(LinkName);
// Quicklauch
if Location = _QUICKLAUNCH then
begin
Reg := TRegIniFile.Create(QUICK_LAUNCH_ROOT);
try
Directory := Reg.ReadString('MapGroups', 'Quick Launch', '');
finally
Reg.Free;
end;
end
else
// Other locations
begin
Reg := TRegIniFile.Create(SHELL_FOLDERS_ROOT);
try
case Location of
_OTHERFOLDER : Directory := SubFolder;
_DESKTOP : Directory := Reg.ReadString('Shell Folders', 'Desktop', '');
_STARTMENU : Directory := Reg.ReadString('Shell Folders', 'Start Menu', '');
_SENDTO : Directory := Reg.ReadString('Shell Folders', 'SendTo', '');
end;
finally
Reg.Free;
end;
end;
if Directory <> '' then
begin
if (SubFolder <> '') and (Location <> _OTHERFOLDER) then
WFileName := Directory + '\' + SubFolder + '\' + LinkName
else
WFileName := Directory + '\' + LinkName;
if WorkingDir = '' then
MySLink.SetWorkingDirectory(PChar(ExtractFilePath(SourceFileName)))
else
MySLink.SetWorkingDirectory(PChar(WorkingDir));
MyPFile.Save(PWChar(WFileName), False);
Result := WFileName;
end;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
PROGRAMA:String;
begin
PROGRAMA := ExtractFileDir(Application.ExeName)+ExtractFileName(Application.exename);
//Create a Shortcut in the Quckick launch toolbar
CreateShortcut(PROGRAMA, _QUICKLAUNCH, '','','','Teste de uso da QuickLaunch');
Showmessage('teste');
end;
end.
A função aparece bem grande pois tem a opção de se colocar atalho no desktop, menu iniciar e outros.
Para mim só interessou colocar atalho na quick launch.
Porém, nada acontece.
Alguém poderia analisar este código e consertá-lo.
Pro meu nível de conhecimento ele está um pouco avançado.
Link para o comentário
Compartilhar em outros sites
7 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.