Ir para conteúdo
Fórum Script Brasil
  • 0

Quick Launch


Paulo Nobre

Pergunta

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

  • 0

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 executavel

em: 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.

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, Graymalkin

Costumo, 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ços

Paulo Nobre

Link para o comentário
Compartilhar em outros sites

  • 0

Olá Paulo, tente trocar:

QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\GrpConv';

por:

QUICK_LAUNCH_ROOT = 'Software\MicroSoft\Windows\CurrentVersion\Explorer';

e

Directory := Reg.ReadString('MapGroups', 'Quick Launch', '');

por

Directory := Reg.ReadString('Shell Folders', 'AppData', '')+'\Microsoft\Internet Explorer\Quick Launch';

Link para o comentário
Compartilhar em outros sites

  • 0

Olá, s3c

Muito obrigado pela dica, funcionou, apenas com um detalhe, que não sei explicar:

Usando

Directory := 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) ou

ExtractFilePath(Application.exename) + '\' +ExtractFileName(Application.exename) ?

Link para o comentário
Compartilhar em outros sites

  • 0

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.

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...