Registro de windows

Iniciado por samirllorente, 1 Febrero 2015, 05:22 AM

0 Miembros y 1 Visitante están viendo este tema.

samirllorente

hola a todos, ire al grano

lo q necesito es crear un .reg para modificar el registro de windows de tal forma que este me haga mi programa para abrir cierto formato de forma prederminada, en este caso es un .mp3 apenas yo haga doble clic sobre el registro este debe hace m programa prederteminado y agg un menu opc al menu contextual
yo ya modifique mi programa para q abra abra canciones por paramentro desde la consola funciona bien, tambien se editar los registros, pero lo q no se q es lo q tengo q modificar para lograr lo mencionado anterior mente si alguien me ayudar se los agradeceria
SamirLlorente

MCKSys Argentina

Hola!

No sé qué SO tienes, pero para hacer algo así, por ej., en Windows 7:

- Para hacer que app.exe abra los archivos .mp3:

Abres el explorador de Windows, seleccionas un archivo .mp3 cualquiera, le haces click-derecho-"Open with" y de menú desplegable seleccionas "Choose default program...". Del cuadro que se abre, haces click en el botón "Browse" y buscas la ubicación de app.exe. Una vez que lo seleccionas, asegúrate de que el check "Always use the selected program to open this kind of file" esté tildado. Luego le das a "OK" y listo.

- Para agregar una opcion al menú conextual del Explorador de Windows:

Creas la clave de registro:

"HKEY_CLASSES_ROOT\*\shell\Abrir con mi programa"

Dentro de esa clave, le agregas una subclave llamada "command". Y el valor por default de la misma debería ser:

[rutaCompleta]app.exe %1


Y listo.
Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Eleкtro

#2
Cita de: MCKSys Argentina en  1 Febrero 2015, 07:13 AM- Para agregar una opcion al menú conextual del Explorador de Windows:

Creas la clave de registro:
"HKEY_CLASSES_ROOT\*\shell\Abrir con mi programa"

Hay que mencionar un detalle muy importante, y es que el comodín "*" afectará a todos los tipos de archivos, así que si quieres que el menú contextual y/o asociación de archivo afecte solamente a un tipo de archivo específico, entonces cambia el comodín por la extensión deseada.

Nota: Si la extensión ya tiene una clave referenciada (en el valor por defecto), entonces deberás realizar más modificaciones.

Yo te sugiero realizar las modificaciones en esta clave para añadir el menú contextual (no en la clave mencionada arriba):
HKEY_CLASSES_ROOT\SystemFileAssociations\.ext\Shell

Ejemplo para una integración del menú contextual para archivos mp3, es un submenu con dos comandos, 'Run', y 'OpenFile':
Código (ini) [Seleccionar]
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.mp3\Shell\MiPrograma]
"MUIVerb"="MiPrograma"
"SubCommands"="MiPrograma.Run;MiPrograma.OpenFile"
"Icon"="C:\\Program Files\\MiPrograma\\MiPrograma.Title.ico"
"Position"="Middle"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MiPrograma.Run]
@="Run MiPrograma"
"icon"="C:\\Program Files\\MiPrograma\\MiPrograma.Run.ico"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MiPrograma.Run\command]
@="C:\\Program Files\\MiPrograma\\MiPrograma.exe"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MiPrograma.OpenFile]
@="Open file in MiPrograma"
"icon"="C:\\Program Files (x86)\\MiPrograma\\MiPrograma.OpenFile.ico"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\MiPrograma.OpenFile\command]
@="\"C:\\Program Files\\MiPrograma\\MiPrograma.exe\" \"%1\""


Me sirvo de estos 2 iconos, plus el icono principal de la aplicación en cuestión (MiPrograma.Title.ico):

MiPrograma.Run.ico
MiPrograma.OpenFile.ico

Resultado:


Saludos








samirllorente

Gracias a todos fue de mucha utilidad, pero ahora tengo otro problema, por ejemplo ahora no quierouno, sino abrir varios archivos, al selecionar dos o mas .mp3 ya no me sale dicho menu contextual  :huh: como hagoo?
SamirLlorente

Eleкtro

#4
Cita de: samirllorente en  3 Febrero 2015, 01:52 AMGracias a todos fue de mucha utilidad, pero ahora tengo otro problema, por ejemplo ahora no quierouno, sino abrir varios archivos, al selecionar dos o mas .mp3 ya no me sale dicho menu contextual  :huh: como hagoo?

El menú contextual debería seguir apareciendo al seleccionar MENOS DE 16 archivos, que es el límite impuesto por defecto en Windows para un menú corriente. Prueba a deshabilitar dicho límite:
Código (dos) [Seleccionar]
REG.exe ADD "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer" /V "MultipleInvokePromptMinimum" /T "REG_DWORD" /D "0x00002710" /F
(reinicia sesión de usuario para aplicar los cambios)

Debo añadir algo más porque no me quedan muy claras tus intenciones:
Espero que entiendas que para poder cargar dos archivos o más archivos desde el menú contextual en una misma instancia de la aplicación, dicha aplicación debe aceptar múltiples argumentos, y si esto no es así entonces requerirías acceso al código fuente y conocimientos avanzados de programación para desarrollar una extensión de la shell (shell-extension), es decir, desarrollar y registrar un menú contextual en el sistema, que permita la carga de múltiples archivos al mismo tiempo en esa aplicación, VB.Net/C# sería una buena elección para llevar a cabo la tarea con esta librería: http://sharpshell.codeplex.com/

Saludos








samirllorente

bueno ahora tengo otro problema, yo cuando seleciono dos o mas archivos se abre mi programa tantas veces como archivos selecionas, osea yo por ej seleciono 3 canciones y abro con mi reproductor, y lo q hace es reproducir cada cancion por aparte no se ponen en una misma lista y yo por consola por ej hago esto:

miprograma.exe "cancion1.mp3" "cancion2.mp3"

y mi programa se abre una sola vez y agregas las dos en la misma lista

lo q hice del menu contexual fue esto

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\SystemFileAssociations\.mp3\Shell\StyleOfMusik]
"MUIVerb"="Style Of Musik"
"SubCommands"="StyleOfMusik.Reproducir;StyleOfMusik.Agregar"
"Icon"="D:\\Samir\\Imagenes\\ParaProgramas\\Icono.ico"
"Position"="Middle"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\StyleOfMusik.Reproducir]
@="Reproducir"
#"icon"="C:\\Program Files\\StyleOfMusik\\StyleOfMusik.Run.ico"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\StyleOfMusik.Reproducir\command]
@="\"C:\\Users\\SamirAndres\\Downloads\\Programs\\StyleOfMusic.exe\" \"%1\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\StyleOfMusik.Agregar]
@="Agregar a lista"
#"icon"="C:\\Program Files (x86)\\StyleOfMusik\\StyleOfMusik.OpenFile.ico"
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\StyleOfMusik.Agregar\command]
#@="\"C:\\Program Files\\StyleOfMusik\\StyleOfMusik.exe\" \"%1\""


aun no lo termino pero es solo para ir haciendo pruebas por eso algunos comentarios  >:(

y bueno ese es problema por ahora :D
q pena molestarte....
SamirLlorente

Eleкtro

#6
Cita de: samirllorente en  5 Febrero 2015, 04:13 AM
bueno ahora tengo otro problema, yo cuando seleciono dos o mas archivos se abre mi programa tantas veces como archivos selecionas, osea yo por ej seleciono 3 canciones y abro con mi reproductor, y lo q hace es reproducir cada cancion por aparte no se ponen en una misma lista y yo por consola por ej hago esto:

miprograma.exe "cancion1.mp3" "cancion2.mp3"

y mi programa se abre una sola vez y agregas las dos en la misma lista

En mi comentario anterior te expliqué el porque. ¿lo has leido?.

Un menú contextual común no puede manejar múltilpes archivos, debes programar y registrar una shell extension en el sistema para registrar el menú mediante COM, no puedes hacerlo con un simple script de registro (bueno, si, añadiendo manualmente todas las claves necesarias, lo cual sería una pesadilla), necesitas aprender programación ...la utilización de un lenguaje capacitado, arriba compartí una librería que yo utilizo para dicha tarea, si estás dispuesto eso es lo único que necesitas usar.

Como último recurso, y solo como último recurso, una alternativa muy ineficiente pero que puede sacarte del apuro sería crear un batch-script y utlizar las opciones del menú para cargar los archivos en el batch en vez de cargarlos al programa como estás haciendo, el bat lo que haría sería registrar cada argumento que le pases en un archivo de texto (escribir cada nombre de fichero), y cuando pasasen digamos 5 segundos de inactividad el bat ejecutaría el prrograma pasándole todos los argumentos que ha recopilado, como en el ejemplo que has mostrado:
Citarmiprograma.exe "cancion1.mp3" "cancion2.mp3"

El problema es que si abres 100 archivos al mismo tiempo desde el menú, se van a abrir 100 instancias de la CMD, y eso va a colapsar por momentos tu sistema, por no decir que la eficacia de este método depende del tiempo de respuesta del PC, del tiempo considerado "inactivo".
El mismo problema ocurriria con una applicación single-instance que se encargase de recoger los argumentos, al final colapsarian las instancias que se intentarían comunicar con la primera instancia del programa "recolector" para ir pasándole argumentos, y daría errores relacionados con IPC, te lo digo porque pasé por este mismo problema hace mucho.
La solución más eficiente para cargar múltiples archivos al mismo tiempo en una única instancia del programa, y de hecho la única solución viable, es registrar tu propio menu contextual, de lo contrario te tienes que conformar con que se abran los archivos en diferentes instancias, o idear métodos incompetentes cono el batch-script "recolector".

Saludos.








engel lex

#7
proponiendo soluciones... no se podría hacer estilo mac os? es decir, el menú contextual en realidad llama al programa y el programa llama al explorador de archivos para solicitar quien está seleccionado? (esto lo digo por el automator de mac (+apple script) que es una super herramienta que todo SO debería tener, no he conseguido nada similar para linux o windows)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

#8
Cita de: engel lex en  5 Febrero 2015, 06:22 AMproponiendo soluciones... no se podría hacer estilo mac os? es decir, el menú contextual en realidad llama al programa y el programa llama al explorador de archivos para solicitar quien está seleccionado? (esto lo digo por el automator de mac (+apple script) que es una super herramienta que todo SO debería tener, no he conseguido nada similar para linux o windows)

Obtener de una sola vez las rutas absolutas de los elementos seleccionados en el explorer es una alternativa más como bien has sugerido, y que como ya sabes se puede realizar con el uso de la programación,
el problema sería que se obtendría el mismo resultado, es decir, si seleccionases 20 archivos desde un subcommand del menú contextual, se van a intentar abrir 20 instancias de la misma aplicación indiferentemente de si la app es single-instance o multi-instance, y por ende, cuantos más archivos seleccionados más instancias simultaneas, llegará un momento en que irremediablemente por una causa o por otra esa metodología dará error.

En el caso de una app single-instance el error será por un fallo de comunicación entre las distintas instancias simultaneas que se intentarán comunicarse con la primera instancia para notificarles su estado,
y en el caso de la app multi-instance el error será más bien una serie de "fallos" o "inconvenientes" por un aumento masivo de recursos que acabará en un colapso de duración indeterminada (hasta que todas las instancias se cerrasen) por una disminuición del tiempo de respuesta al abrir demasiadas instancias al mismo tiempo.

Por otro lado, obviamente nada de eso ocurriría si solo hablamos de abrir 2 miseros archivos, no pasa nada por tener 2 instancias abiertas de un simple programa, pero cuantos más archivos/instancias sean mayor es la probabilidad de que sucedan ese tipo de conflictos, de hecho llegará un punto en el que sucederán,
por eso considero ineficiente este tipo de técnicas, porque al fin y al cabo, utilizar el programa para obtener de una los elementos seleccionados en la ventana actual del explorer, o utilizar el programa para ir recibiendo los argumentos e ir guardándolos uno por uno, al final ambos métodos acabarán causando el mismo conflicto.

De todas formas, debo aclarar un detalle muy importante ya que he afirmado muchas cosas descuidadamente sin mencionar en que baso mi experiencia en este tema, yo estoy hablando del comportamiento de las instancias de un ensamblado .Net, lo he verificado en C# y en Vb.Net, pero no he comprobado si lo mismo pasaría con la JVM de Java por ejemplo.

Aunque por lo que he leido, el tratamiento de las instancias en Java es practicamente identico en su esencia, es decir, las nuevas instancias se deben comunicar con la primera instancia para notificarles su intento de ejecución, y luego salir, por lo que deduzco que mútiples instancias de una aplicación single-instance ocasionaría el mismo conflicto del que ya he hablado.

TL/DR:
En cambio, nada de lo comentado arriba sucedería al utilizar un menú registrado, esa es la gran diferencia, ya que ...bueno, para ser sinceros no tengo muy muy claro exactamente como es el comportamiento de un menú registrado, es algo bastante interno que no he tenido la oportunidad de estudiar en profundidad (por falta de información), como se ve me sirvo de herramientas de terceros para llevar esta tarea a cabo, es un tema muy delicado y extenso,
pero basicamente se trata de desarrollar una librería COM, en la que debemos escribir un método llamemoslo "Capturador" que recibirá un argumento y esto argumento servirá para capturar los nombres de archivos, y llamar a "X" programa al terminar de capturar (o lo que queramos hacer al terminar),
entonces al usar nuestro método "Capturador", que está asociado a un subcommand del menú contextual de nuestra librería COM registrada en el sistema, la dll llamará al método "Capturador" e interceptará todos los argumentos evitando ese tipo de conflictos que hablé entre instancias de aplicaciones.
Más o menos, tengo la idea de que trabaja de una manera parecida, dicho de una forma muy poco específica, lo siento.

Saludos!








samirllorente

#9
Cita de: engel lex en  5 Febrero 2015, 06:22 AM
proponiendo soluciones... no se podría hacer estilo mac os? es decir, el menú contextual en realidad llama al programa y el programa llama al explorador de archivos para solicitar quien está seleccionado? (esto lo digo por el automator de mac (+apple script) que es una super herramienta que todo SO debería tener, no he conseguido nada similar para linux o windows)

Algo como esto?



pues en c++ y en java yo lo he logrado si es lo q buscas, nose
SamirLlorente