Ir al contenido


Foto

[RESUELTO] Agregando un Menú contextual en Windows Explorer


  • Por favor identifícate para responder
12 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 enero 2010 - 05:09

Hola compañeros, aquí he llegado a un puento de mi proyecto que para mí son aguas desconocidas, se trata de la aplicación de un menú contextual al explorardor de Windows, tengo un code donde se agrega el dichoso menú al registro de windows que adapté a mi necesidad, pero hay algunas cosas que no las tengo muy claro y espero que me puedan ayudar con eso, aquí coloco el code:



delphi
  1. procedure SetContextMenu(Root,Ext: string);
  2. var
  3.   sTypeName: string;
  4. begin
  5.   with TRegistry.Create do
  6.     try
  7.       RootKey := Root;
  8.       { Set the extension you want. Include the '.' character }
  9.       OpenKey('.'+LowerCase(Ext), True);
  10.       { Get file type name }
  11.       sTypeName := ReadString('');
  12.       CloseKey;
  13.       { Create explorer extension. Instead of 'Open' put whatever you want. }
  14.       OpenKey('' + sTypeName + 'ShellOpen', True);
  15.       { The context menu item }
  16.       WriteString('', 'Play with MiniPlayer');
  17.       CloseKey;
  18.  
  19.       OpenKey('' + sTypeName + 'ShellOpenCommand', True);
  20.       { The commandline. Enter all the commandline options you need.
  21.         Remember to use quotes for long file names with spaces. Even if your
  22.         application's filename doesn't contain any spaces the folder that
  23.         it's in may contain them.
  24.         %1 - is the selected file's name. }
  25.       WriteString('', '"' + Application.ExeName + '" "%1"');
  26.       CloseKey;
  27.     finally
  28.       Free;
  29.     end;
  30. end;



Como verán el code lo hice como un procedimiento, ahora, hay ciertas cosas como dije anteriormente que no las tengo muy claro, y las dudas las tengo en las siguientes líneas:



delphi
  1. sTypeName := ReadString('');





delphi
  1. { Create explorer extension. Instead of 'Open' put whatever you want. }
  2.       OpenKey('' + sTypeName + 'ShellOpen', True);





delphi
  1. OpenKey('' + sTypeName + 'ShellOpenCommand', True);



En esas tres líneas no entiendo que debo poner en sTypeName, no sé a qué se refiere con ShellOpen y ShellOpenCommand, nada de nada, a ver si alguno de ustedes me trae la luz en este asunto.

Saludos.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 19 enero 2010 - 05:50

Amigo mirá si esto te sirve, parece estar mas detallado.



delphi
  1. {
  2. To add a context menu item to Windows Explorer you have create a few
  3. entries in
  4. the system Registry. First you have to get the file type's name, add the
  5. context
  6. menu item and add then the command line. Besides files you can add
  7. context menus
  8. to drives or folders.
  9. Special extensions:
  10. - .drive - drives.
  11. - .folder - folders.
  12. }
  13.  
  14. uses
  15.   Registry;
  16.   // ...
  17. var
  18.   sTypeName: string;
  19. begin
  20.   with TRegistry.Create do
  21.     try
  22.       RootKey := HKEY_CLASSES_ROOT;
  23.       { Set the extension you want. Include the '.' character }
  24.       OpenKey('.Extension', True);
  25.       { Get file type name }
  26.       sTypeName := ReadString('');
  27.       CloseKey;
  28.  
  29.       (* Create explorer extension.
  30.       *
  31.       * Instead of 'Open' put whatever you want.
  32.       *)
  33.       OpenKey('' + sTypeName + 'ShellOpen', True);
  34.       { The context menu item }
  35.       WriteString('', 'Open in my application');
  36.       CloseKey;
  37.  
  38.       OpenKey('' + sTypeName + 'ShellOpenCommand', True);
  39.       (* The commandline. Enter all the commandline options you need.
  40.       * Remember to use quotes for long file names with spaces. Even if
  41. your
  42.       * application's filename doesn't contain any spaces the folder that
  43.       * it's in may contain them.
  44.       *
  45.       * %1 - is the selected file's name.
  46.       *)
  47.       WriteString('', '"' + Application.ExeName + '" "%1"');
  48.       CloseKey;
  49.  
  50.       (* Repeat this for every file type you want to add a context menu
  51. to.
  52.       * For this operation you may want to use a for loop and a constat
  53.       * string array with the file extensions.
  54.       *)
  55.     finally
  56.       Free;
  57.     end;
  58. end;


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 enero 2010 - 06:10

Gracias Wilson, pues es prácticamente lo mismo, pero ese no es el caso, el caso es que no entiendo qué valores colocar en las líneas que mencioné anteriormente.

Saludos.
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 19 enero 2010 - 06:32

Por allá encontré un hilo viejo del CD, puede que esto explique algo:

En cuanto a lo de la clave del registro, en realidad son varias:

-Primero, en HK_CLASSES_ROOT buscas la extensión del archivo (.ext, por ejemplo) y el valor "(Predeterminado)" escribes lo que sea (algo que puedas recordar, en este ejemplo "myapp.ext") En el caso de que ya haya algo escrito ir al siguiente paso.
-Después crear la clave HK_CLASSES_ROOT\myapp.ext (o lo que hayas escrito antes). Ahí, en "(Predeterminado)" escribes la descripción del archivo, y creas dos SubClaves "DefaultIcon" y "shell"
-En "Predeterminado" de DefaultIcon escribes el archivo de icono que quieras poner con el índice (ejemplo: "C:\Windows\system32\shell32.dll,14" ó "C:\Archivos de programa\MyApp\MyApp.exe,0") Este icono será con el que aparezca en el Explorador.
-En "Shell" creas tantas claves como subitems quieras en el Explorador. Por ejemplo creas "open" (esta es la que se ejecuta por defecto), en "Predeterminado" de "open" pones lo que quieras que aparezca en el Item del menú del Explorador, creas en "open" una subclave llamada "command" y en su valor "Predeterminado" escribes el comando a ejecutar (Por ejemplo "C:\archivos de programa\MyApp\Myapp.exe %1") "%1" sirve para indicar el archivo seleccionado.

En teoría ya está todo hecho, pero para que en Explorador aparezcan los cambios debes reiniciar sesión o ejecutar la función SHChangeNotify de la API de windows (está en la unit "ShlObj" o en "Ole2", no lo recuerdo bien) con los valores adecuados (mira la ayuda de la función).



En cuanto lo del ejemplo que incorpora Delphi, eso es especial, porque permite con una DLL crear cuantos items necesites, o ninguno si el archivo no es compatible, y poner icono en el Item y la propiedad Hint, pero también es más complejo.

Espero que te sirva de ayuda


  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 19 enero 2010 - 06:43

[HKEY_CLASSES_ROOT\*\shell\Nombre_Aplicacion\command]
Valor = Ruta de la aplicación %1

[HKEY_CLASSES_ROOT\Folder\shell\Nombre_Aplicacion\command]
Valor = Ruta de la aplicación %1


Saludos.
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 19 enero 2010 - 06:54

Gracias escafandra, pero ahora que traducí el code de las asociaiones de archivos en C++ que publicaste meses atrás, me dije que eso me podría ser útil, ya que puedo matar dos pájaros de un tiro :p, lo hice fue agregar la parte donde agrego el menú contextual y la cosa me queda así:



delphi
  1. procedure RegisterFileType(Ext,PathExec: string);
  2. var Registry: TRegistry;
  3.     sTypeName: string;
  4. begin
  5.   Registry := TRegistry.Create;
  6.     try
  7.       Registry.RootKey := HKEY_CLASSES_ROOT;
  8.       //Crear la Clave .Ext
  9.       if (Registry.OpenKey('.'+LowerCase(Ext), True)) then
  10.       begin
  11.         sTypeName := Registry.ReadString('');
  12.         // Valor con el nombre del tipo de archivo para esta clave (extfile)
  13.         Registry.WriteString('', LowerCase(Ext) + 'file');
  14.         Registry.CloseKey;
  15.       end;
  16.  
  17.       //creamos el item del menu
  18.       if (Registry.OpenKey('' + sTypeName + 'shell\\Open', true)) then
  19.         begin
  20.           Registry.WriteString('', 'Play with MiniPlayer');
  21.           Registry.CloseKey;
  22.         end;
  23.  
  24.       // Crear una clave nueva para el nombre del tipo de archivo dado antes (extfile)
  25.       if (Registry.CreateKey(LowerCase(Ext) + 'file')) then
  26.         begin
  27.           // Crear una nueva clave para el icono por defecto
  28.           if (Registry.OpenKey(LowerCase(Ext) + 'file\\DefaultIcon', true)) then
  29.           begin
  30.             // Crear un valor con el icono (PathExec.exe,0)
  31.             Registry.WriteString('', PathExec + ',0');
  32.             Registry.CloseKey;
  33.           end;
  34.           if (Registry.OpenKey(LowerCase(Ext) + 'file\\shell\\open\\command', true)) then
  35.           begin
  36.             //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1")
  37.             Registry.WriteString('', PathExec + '"%1"');
  38.             Registry.CloseKey;
  39.           end;
  40.         end;
  41.     finally
  42.       Registry.Free;
  43.     end;
  44. SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
  45. end;



Aún no lo he probado, por temor a meter la pata y 'chingar' windows, me gustaría que me confirmaras amigo escafandra si está bien.

Saludos
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 19 enero 2010 - 07:47

Prueba con esto:



delphi
  1. uses
  2.   Registry, ShlObj;
  3.  
  4. procedure RegisterFileType(Ext,PathExec: string);
  5. var Registry: TRegistry;
  6. //    sTypeName: string;
  7. begin
  8.   Registry := TRegistry.Create;
  9.     try
  10.       Registry.RootKey := HKEY_CLASSES_ROOT;
  11.       //Crear la Clave .Ext
  12.       if (Registry.OpenKey('.'+LowerCase(Ext), True)) then
  13.       begin
  14. //        sTypeName := Registry.ReadString('');
  15.         // Valor con el nombre del tipo de archivo para esta clave (extfile)
  16.         Registry.WriteString('', LowerCase(Ext) + 'file');
  17.         Registry.CloseKey;
  18.       end;
  19.  
  20.       //creamos el item del menu
  21.       if (Registry.OpenKey('Folder\shell\' + 'Play with MiniPlayer' + '\command', true)) then
  22.         begin
  23.           Registry.WriteString('', PathExec + ' "%1"');
  24.           Registry.CloseKey;
  25.         end;
  26.       if (Registry.OpenKey('*\shell\' + 'Play with MiniPlayer' + '\command', true)) then
  27.         begin
  28.           Registry.WriteString('', PathExec + ' "%1"');
  29.           Registry.CloseKey;
  30.         end;
  31.  
  32.       // Crear una clave nueva para el nombre del tipo de archivo dado antes (extfile)
  33.       if (Registry.CreateKey(LowerCase(Ext) + 'file')) then
  34.         begin
  35.           // Crear una nueva clave para el icono por defecto
  36.           if (Registry.OpenKey(LowerCase(Ext) + 'file\DefaultIcon', true)) then
  37.           begin
  38.             // Crear un valor con el icono (PathExec.exe,0)
  39.             Registry.WriteString('', PathExec + ',0');
  40.             Registry.CloseKey;
  41.           end;
  42.           if (Registry.OpenKey(LowerCase(Ext) + 'file\shell\open\command', true)) then
  43.           begin
  44.             //Crear el valor para el ejecutable que abre el tipo de archivo (PathExec.exe "%1")
  45.             Registry.WriteString('', PathExec + '"%1"');
  46.             Registry.CloseKey;
  47.           end;
  48.         end;
  49.     finally
  50.       Registry.Free;
  51.     end;
  52. SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
  53. end;



Saludos.
  • 0

#8 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 19 enero 2010 - 07:49

Saludos ENECUMENE...

Bajate VIRTUALBOX y create un Windows Virtual y asi te lo puedes chingar cuantas veces quieras... jejejejej


Me causo mucha gracia lo de 'chingar'...  jejejejej... 

Yo tengo con VITRUALBOX sistemas que utilizo como LABORATORIO si pasa ALGO.. simplemente lo vuelvo a CARGAR..y no PASA NADA...

SALUDOS..


  • 0

#9 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.469 mensajes
  • LocationMéxico

Escrito 19 enero 2010 - 08:15

...... Me causo mucha gracia lo de 'chingar'......


Es que nuestro amigo enecumene, ya está mas mexicanizado que nadie :D :D :D

Salud OS
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 enero 2010 - 08:28

Esa es una buena idea amigo pcicom, ya estoy descargandolo, luego les comento despúes de "chingarlo" :p.

Saludos.
  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 enero 2010 - 12:54

Hola de nuevo, luego de haber instalado el virtualbox y windows xp probé la mejora de escafandra y me ha funcionado perfectamente (y) no se me "chingó" el windows :D.

Saludos.
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 enero 2010 - 01:06

Dejo muestras del resultado en el anexo.

Saludos.
  • 0

#13 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 20 enero 2010 - 01:13

Da gusto que hayas seguido el CONSEJO...    y a chingar..  se ha dicho...  JEJEJEJEJ

  • 0




IP.Board spam blocked by CleanTalk.