domingo, 17 de abril de 2011

Adicionando o sistema no menu de contexto do Windows Explorer


Aqui vai uma dica para adicionar um item ao menu de contexto do Windows Explorer, exibido ao clicarmos com o botão direito do mouse sobre uma pasta.

Quando o usuário clica com o botão direito sobre uma pasta no Windows Explorer (ou em um componente TShellTreeView) um menu de contexto é exibido. Entre os itens padrões é possível adicionar um para a sua própria aplicação. Quando o usuário clicar neste seu item, o programa será iniciado e o caminho daquele diretório será passado como parâmetro.

A procedure a seguir adiciona uma entrada no registro do Windows para "registrar o programa" como um comando válido no menu de contexto:

procedure EnsureShellFolderPopupItem(const itemName: string);
begin
  with TRegistry.Create do
  try
    RootKey := HKEY_CLASSES_ROOT;
    if OpenKey('Directory\shell', true) then
    begin
      if OpenKey(itemName+'\command', true) then
        WriteString('', '"'+Application.ExeName+'" "%1"');
    end;
  finally
    Free;
  end;
end;

Este código fará a adição de uma chave na seguinte forma:

HKEY_CLASSES_ROOT\Directory\shell\itemName

Onde itemName será passado por parâmetro à função (vide código abaixo) e que na verdade será o texto de exibição no menu de contexto. Seu valor será o caminho do programa e o %1, para indicar que a pasta clicada será enviada por parâmetro à aplicação:

;@="c:\...\Project1.exe" "%1" - Onde "c:\...\Project1.exe" é o local do seu executável.

Agora no evento onCreate do Form, façamos:

procedure TForm1.FormCreate(Sender: TObject);
begin
  //certifica que nosso item está no menu de contexto de diretórios
  //não é necessário chamar sempre, mas para testes está ok!
  EnsureShellFolderPopupItem('Processar com Meu Programa');

  //exibe qual a pasta que foi selecionada para processamento
  if ParamCount > 0 then
    ShowMessage('Pasta selecionada: ' + ParamStr(1))
  else
    ShowMessage('Sistema iniciado diretamente');
end;

Para testar, rode o programa pelo Delphi para que seja processada a procedure EnsureShellFolderPopupItem. Você receberá a mensagem "Sistema iniciado diretamente". Em seguida, feche o programa e clique com o botão direito sobre qualquer diretório no seu computador.