¿Cómo puedo crear un elemento del menú contextual del shell que tome varios archivos como argumentos?


10

Crear un elemento del menú contextual del Shell de Windows que tome un solo archivo como argumento es fácil. Vea esta pregunta para un ejemplo.

Sin embargo, ¿cómo se crea un elemento del menú contextual que toma varios archivos como argumentos? Digamos, para una herramienta de combinación de diferencias (en mi caso P4Merge), aunque la misma técnica sin duda sería aplicable también para otras aplicaciones.

He instalado P4Merge pero no agrega un elemento al menú contextual automáticamente, por lo que tendré que hacerlo manualmente.

Cuando intenté usar:

"C:\Program Files\Perforce\p4merge.exe" %1 %2

como la línea de comando recibí un error:

Errores: se necesitan al menos dos archivos. No se puede abrir solo un archivo. P4Merge necesita 0, 2 o 3 archivos.

Cuando intenté usar:

"C:\Program Files\Perforce\p4merge.exe" %0 %1

Como línea de comando, abrió dos instancias de P4Merge, una para cada archivo.

Parece que los nombres de archivo correctos se están pasando a% 0 y% 1, pero se está ejecutando una instancia diferente de la aplicación P4Merge para cada uno.

Actualmente tengo la herramienta DiffMerge de SourceGear que tiene un elemento en el menú contextual de Shell y que funciona muy bien, ya que puedo seleccionar dos archivos y usar el elemento del menú contextual para ejecutar una diferencia en ellos. Intenté buscar en el registro para ver qué argumentos usa DiffMerge, pero no pude encontrar una línea de comandos de DiffMerge que incluyera argumentos.


2
Como descubrió, no hay forma de hacer lo que quiere con un simple hack de registro. Solo hay% 1 porque la extensión solo se aplica a un objeto y se ejecuta por separado para varios objetos. Requiere programar una extensión de shell completa. Sin embargo, hay algunos programas / extensiones de shell que le permiten hacer algunas cosas de menú contextual más avanzadas que lo que permitirá un hack de registro. (El único que recuerdo es MMM .) Desafortunadamente, creo que tienden a limitarse a permitirle crear submenús en lugar de permitir que se suelten varios objetos.
Synetech

Respuestas:


18

También puede intentar agregar el programa al menú Enviar a.


Sí, eso funciona muy bien.
Synetech

1
Funcionó perfectamente. Aquí hay instrucciones sobre cómo agregar una aplicación al menú SendTo en Windows 7. No hubo necesidad de agregar ningún parámetro de línea de comandos, simplemente coloqué el acceso directo de la aplicación en la carpeta% APPDATA% \ Microsoft \ Windows \ SendTo. De vuelta en el Explorador de Windows, seleccionando dos archivos, luego haciendo clic derecho y seleccionando Enviar a> P4Merge realizó una diferencia en los archivos seleccionados.
SimonTewsi

3

Al buscar la respuesta, parece que no hay una solución simple y que se necesita una extensión de shell. Mirando nuevamente las entradas del registro para DiffMerge, parece usar una extensión de shell: DiffMergeShellExtension64.dll. Si P4Merge no tiene una extensión de shell de este tipo, parece que la única forma en que podría hacerlo funcionar correctamente en el menú contextual del Explorador de Windows sería escribir una yo mismo.

La guía completa de idiotas para escribir series de extensiones de shell en Code Project es una guía útil para escribir extensiones de shell. La Parte II de la serie se trata de escribir una extensión que maneje múltiples archivos a la vez (exactamente lo que necesito).

Advertencia: La guía completa de idiotas para escribir extensiones de shell utiliza C y COM, ATL (Active Template Library) y MFC (Microsoft Foundation Classes). Por lo tanto, escribir una extensión de shell, si no está familiarizado con esas tecnologías, será un proceso largo y potencialmente difícil; definitivamente no es algo que puedas hacer en una hora.


2

Puede hacerlo con mi programa context-menu-launcher (instancia única) :

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge]
"MultiSelectModel"="Player"

[HKEY_CLASSES_ROOT\SystemFileAssociations\.txt\Shell\p4merge\Command]
@="\"d:\\singleinstance.exe\" %1 \"C:\\Program Files\\Perforce\\p4merge.exe\" $files --si-timeout 400"

No enlace directamente a los .exearchivos en sus respuestas sin dejar claro que comenzará una descarga automática.
DavidPostill

Funciona como un encanto, gracias. ¿Hay alguna forma de asociar la aplicación de instancia única con cualquier tipo de archivo, sin agregarla a las asociaciones de archivos para cada tipo de archivo individualmente? Por ejemplo, actualmente uso DiffMerge para comparar cosas como archivos XML, scripts SQL, archivos de configuración, archivos * .cs, archivos .gitignore y otros.
SimonTewsi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.