Seleccionar Archivo o Carpeta sin Dialog

Iniciado por rigorvzla, 13 Noviembre 2018, 13:33 PM

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

rigorvzla

Hola amigos, tengo un problema al cual no le eh encontrado solucion, poniendole este ejemplo espero puedan entenderme.

Cuando tenemos el WinRAR instalado, podemos hacer click derecho en cualquier archivo (lugar escritorio por ejemplo) , el cual nos desplega un menu cotextual con una serie de opciones, dentro las cuales esta la de ( extraer o descomprimir archivo , segun sea el caso) yo quiero saber como es posible lograr eso, siendo mas especifico, como es posible lograr obtener la ruta completa del archivo para realizar la accion en este caso ( comprimir o descomprimir archivo o carpeta).

Eh entendido anteriormente, que para crear una opcion o boton en el menucontextual es necesario crear una entrada en el registro del windows, cosa ya explicada en el ultimo tema en el cual me asistieron de manera excelente.
Y de momento es un tema ya entendido.

Normalmente uno obtiene la ruta de el archivo o carpeta con un openfiledialog o un browserdialog, el cual nos despliega un menu y es ahi donde seleccionamos el archivo o carpeteta, luego disponer de esa ruta, en mi caso eso no es lo que necesito, en mi caso, necesito obtener la ruta de manera automatica , asi como lo hace el winrar cuando uno selecciona el archivo a comprimir (menu que aparece en el menu contextual al hacer click derecho).

Espero puedan entender mi pregunta y ayudarme feliz dia.

ThunderCls

Puedes usar una entrada en el registro como:

myapp.exe "%1"

luego cuando tu aplicacion es lanzada la direccion del fichero sera pasada como parametro, asi que necesitas parsearlo correctamente
Saludos
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

rigorvzla

podrias ser mas explicito no entendi nada , porfavor disculpa

ThunderCls

1- ok, teniendo en cuenta que has añadido tú aplicación al menú contextual desde la entrada de registro HKEY_CLASSES_ROOT y usando un command como:

C:\\TU_RUTA\\ALGUN_FOLDER\\TU_PROGRAMA.exe %1

al ser lanzada tu aplicación mediante esta entrada en el menú contextual, la dirección del fichero (sobre el cual invocaste tu aplicación) será pasada a tu aplicación como parámetro.

https://www.howtogeek.com/107965/how-to-add-any-application-shortcut-to-windows-explorers-context-menu/amp/


2- Luego necesitas parsear estas líneas de parámetros en tu propia aplicación para que actúe como deseas

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/main-and-command-args/command-line-arguments
https://stackoverflow.com/questions/24661047/how-to-get-command-line-parameters-and-put-them-into-variables
https://stackoverflow.com/questions/1179532/how-do-i-pass-command-line-arguments-to-a-winforms-application


Espero haberme explicado
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

rigorvzla

hola de nuevo, luego de algo de tiempo estoy por aqui informando lo siguiente y esperando acesoria.

Resulta que ya tengo la entrada en el registro

  private const string MenuName01 = "7-Zip.7z\\shell\\Asistente Virtual AIRH";
            public const string Command01 = "7-Zip.7z\\shell\\Asistente Virtual AIRH\\command";

public static void cierreContextual()
            {
                try
                {
                    RegistryKey reg01 = Registry.ClassesRoot.OpenSubKey(Command01);
if (reg01 != null)
                    {
                        reg01.Close();
                        Registry.ClassesRoot.DeleteSubKey(Command01);
                    }
                    reg01 = Registry.ClassesRoot.OpenSubKey(MenuName01);
                    if (reg01 != null)
                    {
                        reg01.Close();
                        Registry.ClassesRoot.DeleteSubKey(MenuName01);
                    }
   }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.ToString());
                }
            }

public static void cargaContextual()
            {
                string ruta01 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Integro.exe /1");

//DEBERIA SER ASI PARA OBTENER LA RUTA
//string ruta01 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, //"Integro.exe %1");

  RegistryKey regmenu01 = null;
                RegistryKey regcmd01 = null;
try
                {
                    regmenu01 = Registry.ClassesRoot.CreateSubKey(MenuName01);
                    if (regmenu01 != null)
                        regmenu01.SetValue("", "AV-AIRH Descomprimir");
                    regcmd01 = Registry.ClassesRoot.CreateSubKey(Command01);
                    if (regcmd01 != null)
                        regcmd01.SetValue("", ruta01);
}
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.ToString());
                }
                finally
                {
                    if (regmenu01 != null)
                        regmenu01.Close();
                    if (regcmd01 != null)
                        regcmd01.Close();
                 }


Ya eso me da una opcion en el menu contextual de los archivos 7z
Lo que ahora sigue es lo siguiente, es la parte de ejecutar el metodo en el programa al que lo dirijo
Y lo tengo ya, quedando asi

static void Main(string[] args)
        {
            switch (args[0])
            {
                case "/1":
                    MessageBox.Show("Extraer");
                    extraccionArchivo(IRA LA RUTA OBTENIDA DESDE EL MENU
CONTEXTUAL);
                    break;
            }
        }

        private void extraccionArchivo(string nombreArchivo)
{
}


El problema esta en que no se como obtener la ruta del archivo seleccionado , a pesar que lei los textos que me dieron y es colocando el parametro %1 , no encuentro como pasar ese "valor obtenido" a una variable y colocarlo en este mentodo mensionado arriiba.

espero puedan ayuarme con esto, de antemano gracias.

Serapis

Si no recuerdo mal, meses atrás ya se te explicó todo, con ejemplos específicos...

...tu programa recibe los argumentos de la acción registrada para la cual el usuario eligió, entre ellos la ruta del fichero sobre el que se pinchó, naturalmente si se incluyó en el registro que te entregue la ruta, que como ya se te ha explicado se tramita como "%1".

Eleкtro

#6
Cómo ya ha dicho el compañero @NEBIRE, esto ya se te explicó, conretamente en este thread:


En el que, aparte de los comentarios que recibiste de otros usuarios, yo aporté el siguiente comentario:

CitarHay dos formas de llevarlo a cabo, la primera manera, que es la más sofisticada y versatil sería mediante el desarrollo de una extensión de la shell (o shell-extension) del menú contextual, lo cual requiere el uso de C++, o de wrappers de C++ para .NET como sería la librería SharpShell, y la segunda manera, que es mucho más simple de llevar a cabo pero también mucho menos sofisticada sería añadiendo ciertas claves en el registro de Windows.

...al cual parece ser que no le hiciste mucho o nada de caso.

En fin. Tienes mil ejemplos disponibles en la World Wide Web sobre como crear un menú contextual mediante el registro de Windows, no es dificil buscar y encontrar, y ponerte a hacerlo, más cuando ya se te mostró un ejemplo funcional en el otro thread.

Aparte, en el repositorio de GitHub de SharpShell también tienes ejemplos de como hacerlo mediante SharpShell, lo cual, repito lo que ya dije en ese otro thread, sería la manera ideal.

Por cierto, no se si lo comenté ya en el otro thread, pero WinRAR lo que hace es registrar en el sistema una shell-extension, concretamente es el archivo RarExt32.dll y RarExt.dll. De hecho cualquier software medianamente profesional utiliza extensiones de shell para crear sus menues contextuales, no se andan añadiendo manualmente claves al registro o usando un vulgar script de registro, así que no le des tantas vueltas y empieza a aprender SharpShell si quieres hacer lo mismo que ellos y de forma eficiente (a falta de C/C++).




Cita de: rigorvzla en 19 Noviembre 2018, 15:54 PM
El problema esta en que no se como obtener la ruta del archivo seleccionado , a pesar que lei los textos que me dieron y es colocando el parametro %1 , no encuentro como pasar ese "valor obtenido" a una variable y colocarlo en este mentodo mensionado arriiba.

El argumento %1 no lo pasarías "a una variable", el argumento %1 se lo enviarías como entrada de datos por linea de comandos a tu programa, es decir, como un argumento command-line (ej. miprograma.exe %1). Y entonces, en tu programa simplemente debes leer los argumentos command-line (System.Environment.GetCommandLineArgs)

Saludos.