Crear Menu Contextual Windows

Iniciado por rigorvzla, 22 Agosto 2018, 01:33 AM

0 Miembros y 4 Visitantes están viendo este tema.

rigorvzla

Elektro , se que me ha costado explicarme, olvidemos que quiero ejecutar una ruta de algun archivo desde el registro, lo que realmento quiero ejecutar en el boton creado del menu contextual es un metodo que tengo en el mismo proyecto , NO es un archivo, es cierta cantidada de lineas de codigos.

menciono el registro por las referencias previas mas no se si es por ahi que deba hacerlo, si es de otra manera espero sea posible puedan guiarme.

Otra forma de explicarlo seria, que al crear el boton en el menu contextual pueda hacer click y me muestre una ventana con un mensaje, osea un metodo, aclaro es un ejemplo simple, lo que realmente quiero es llamar un metodo que ya tengo en el proyecto.

Eleкtro

#11
Cita de: rigorvzla en 25 Agosto 2018, 05:14 AM
Elektro , se que me ha costado explicarme, olvidemos que quiero ejecutar una ruta de algun archivo desde el registro, lo que realmento quiero ejecutar en el boton creado del menu contextual es un metodo que tengo en el mismo proyecto , NO es un archivo, es cierta cantidada de lineas de codigos.

Cita de: rigorvzla en 25 Agosto 2018, 05:14 AMOtra forma de explicarlo seria, que al crear el boton en el menu contextual pueda hacer click y me muestre una ventana con un mensaje, osea un metodo, aclaro es un ejemplo simple, lo que realmente quiero es llamar un metodo que ya tengo en el proyecto.

Tú puedes tener un proyecto con 800.000 lineas de código, da igual por que al compilarlo cómo resultado se generará un archivo de cierto tipo. Logicamente eso ya lo sabías, entonces, ¿cual es el problema?, no comprendo a qué le estás dando vueltas, lo que quieres hacer lo harías añadiendo el comando al menú contextual para ejecutar la aplicación compilada y que tu aplicación realice una llamada el método "X" para mostrar una caja de mensaje, es así de simple y sencillo. Intenta explicarnos si hay algo que no entiendas de ese procedimiento.

Cita de: rigorvzla en 25 Agosto 2018, 05:14 AMmenciono el registro por las referencias previas mas no se si es por ahi que deba hacerlo, si es de otra manera espero sea posible puedan guiarme.

Esa es la manera, ya se te explicó un poco por encima las dos formas de hacerlo (manipulación del registro, o extensión de la shell).

saludos








Serapis

Cita de: rigorvzla en 25 Agosto 2018, 05:14 AM
...lo que realmento quiero ejecutar en el boton creado del menu contextual es un metodo que tengo en el mismo proyecto , NO es un archivo, es cierta cantidada de lineas de codigos.
...
Otra forma de explicarlo seria, que al crear el boton en el menu contextual pueda hacer click y me muestre una ventana con un mensaje, osea un metodo, aclaro es un ejemplo simple, lo que realmente quiero es llamar un metodo que ya tengo en el proyecto.
...pero es que ya se te ha explicado... Al final no te sales del registro, por lo que todo lo dicho con anterioridad se aplica.

Lo único que te falta es que tú trates en tu programa la línea de comando que recibe el programa cuando se arranca... para hacer exactamente lo que quieres... me resulta muy vago eso de 'un método', 'muchas líneas'... sea lo que sea tendrá un nombre (verbo), que lo defina con claridad.

Si la línea de comando está vacía, es porque el programa se ha iniciado vía doble click (por ejemplo, etc..) por parte del usuario o invocada por otra aplicación...
Si la línea de comando no está vacía, entonces debes procesar los parámetros que recibes para hacer lo que necesites, acorde a la acción solicitada (puede haber sido invocada desde la shell del sistema o desde un *.bat, por ejemplo o incluso desde otro programa...

A la tarde te pongo un ejemplo sencillo, en VB... registrando unas acciones con un fichero reg (el como edites el registro es lo de menos, de cara a explicar el resto, pués debemos suponer que tras todo lo hablado, al menos ya sabes manipular el trozo de código que pusiste para registrar lo que necesites), y luego investigando los parámetros cuando el programa arranca hasta cumplir 2 o 3 sencillas tareas distintas... y a partir de ahí, no debiera quedarte dudas.



De todos modos, tienes que pensarte seriamente en ponerte a leer más libros/manuales, para rellenar todas esas lagunas que tienes... Te resulta difícil entender cosas elementales, precisamente por esas lagunas que presentas, cuando con 4 explicaciones imprecisas debieran ser suficientes.

Serapis

#13
CitarHola nebire, disculpa el medio quiero agradecerte por tu explicacion que fue muy solida y precisa, mas no me solvento lo siguiente, espero ser lo mas claro posible y disculpa si no, necesito que una vez creado el "boton" llamemoslo asi , en el menu contextual, en vez de llamar a un archivo .exe, llame un metodo del mismo proyecto.

Como puedo lograr tal cosa? en caso de no ser por este medio, como deberia ser, quiero que al apretar ese boton creado en el menu contextual por ejemplo me ejecute un mensaje X, tantas vecees yo lo aprete.

no se como hacerlo no se como argumentar mi programa exe para pasar ahi el metodo.

Disculpa mi ignorancia y espero puedas entenderme mas claramente.
Ya dije antes que haría un sencillo programa de ejmplo, en el que puedas basarte.

Creo que tu fallo (ahora), está en que, parece que no comprendes qué es y como funciona la 'linea de comandos' que recibe un programa y al caso, el ejemplo que te pondré espero que te aclares las dudas.

Desde fuera de un programa, no puede llamarse a un método de un programa, si no es a través del propio programa, sea por línea de comandos, sea por un punto de entrada al método. Esto último solo está disponible en librerías, porque un ejecutable no expone 'funciones/métodos públicos (esa es precisamente la idea de las librerías, exponer funciones que puedan ser invocadas desde fuera, y su diseño, responde justamente a eso)... y por tanto (para los ejecutables (que no son servidores)) solo hay un único punto de acceso al programa. ...pero precisamente es en esa entrada donde se debe evaluar si se ha recibido una orden (parámetro), para invocar un método específico. No me extiendo más, pués ya iré explicando cuando ponga el ejemplo, seccionando el código en varias partes donde comento...

Perdona si dije que lo pondría a la tarde y no ha sido así, pero al final, uno no es dueño de su tiempo libre... surgen cosas y al final uno tiene horarios intempestivos, a lo largo de la noche (si no me entra sueño) o mañana... vamos tan pronto saque una horita libre (y ganas de ponerme con elllo), lo hago... Si tienes muchas prisas, entonces intenta investigar por tu cuenta.

rigorvzla

#14
perfecto, esperare el ejemplo que mensionas , no habia leido esa parte, por otro lado si eh investigado por mi cuenta para poder comprender mucho mas y asi al ver tu ejemplo lo tenga ya todo mas claro. y si en efecto siempre surgen imprevistos.

Anexo, eh logrado entender un poco mas lo de los argumentos en un ejemplo de consola que vi en youtube, y me ha funcionado pero intentandolo hacer en wpf para mi proyecto me genera este error.

CitarSystem.Windows.Markup.XamlParseException: ''No se encontró ningún constructor coincidente en el tipo 'MenuContextual.MainWindow'. Puede usar las directivas Arguments o FactoryMethod para construir este tipo.' (número de línea: '6'; posición de línea: '9').'

MissingMethodException: No se encontró ningún constructor predeterminado para el tipo 'MenuContextual.MainWindow'. Puede usar las directivas Arguments o FactoryMethod para construir este tipo.

Ya esperare ese ejemplo ,siento que lo entendere muucho mas. Gracias por la ayuda NEBIRE y ELEKTRO

Eleкtro

#15
Cita de: rigorvzla en 25 Agosto 2018, 23:46 PMintentandolo hacer en wpf para mi proyecto me genera este error.

Por mi parte carezco de suficiente experiencia, costumbre, destreza e intuición en problemas relacionados con la tecnología WPF, estoy mucho más habituado a Windows Forms, y creo que no me equivoco al suponer que el compañero @NEBIRE también, sin embargo podrías encontrar una o varias posibles soluciones a ese tipo de excepción aquí:

Dices que viste un video-tutorial, pero de todas formas aquí abajo te dejo un ejemplo de uso de argumentos command line basado en WPF, el cual me parece muy simple y sencillo de aplicar (cualquiera sin experiencia puede reproducirlo con solo copiar y pegar):

Y por último, aquí lo mismo pero sin extensas explicaciones y usando un argumento nombrado:
...el cual es un copy&paste del ejemplo original de la MSDN:

Saludos








rigorvzla

Muchas gracias elektro me base en este codigo que dejastes
Citarhttps://stackoverflow.com/a/11770322/1248295

Y me resulto ya aplico el parametro al metodo que yo quiero, el detalle esta en que se abre la aplicacion tantas veces como llame el metodo, supongo que ya es otro tema.

Anexo como lo implemente
App.axml.cs
void App_Startup(object sender, StartupEventArgs e)
        {
            switch (e.Args[0])
            {
                case "o":
                    MessageBox.Show("Pasó");
                    break;

                case "q":
                    MessageBox.Show("Si Pasó");
                    break;
            }
        }


A donde llamo el metodo
private void cargaContextual()
        {
            RegistryKey regmenu = null;
            RegistryKey regcmd = null;
            try
            {
                regmenu = Registry.ClassesRoot.CreateSubKey(MenuName);
                if (regmenu != null)
                    regmenu.SetValue("", "AV-AIRH");
                regcmd = Registry.ClassesRoot.CreateSubKey(Command);
                if (regcmd != null)
                    regcmd.SetValue("", @"E:\Rigor\Visual Studio 2017\Projects\MenuContextual\MenuContextual\bin\Debug\MenuContextual.exe q");
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.ToString());
            }
            finally
            {
                if (regmenu != null)
                    regmenu.Close();
                if (regcmd != null)
                    regcmd.Close();
            }
        }


Y Funciona perfecto, solo que abre de nuevo la aplicacion... cosa que me tocara ver.

Por lo demas muy agradecido por la atencion prestada y si esta en lo posible ver el codigo que el amigo NEBIRE pondra.

Gracias Elektro!!

Eleкtro

#17
Cita de: rigorvzla en 26 Agosto 2018, 04:48 AMse abre la aplicacion tantas veces como llame el metodo

Querrás decir que se abre tantas veces como hagas click en el comando del menú contextual, o al menos eso es lo que yo entendí...

Aquí tienes distintos ejemplos en WPF para evitar la ejecución de múltiples instancias de un programa:


Saludos








rigorvzla

Lo implemente a mi proyecto, y el no abre multiples veces, a pesar que ya la parte del argumento esta funcionando, no sirve por el hecho de que no toma solo el argumento , abre el programa para ejecutar con el argumento el metodo, en caso de estar ya abierto el programa, no funciona el argumento cuando se usa.

Eleкtro

#19
Cita de: rigorvzla en 26 Agosto 2018, 05:37 AMen caso de estar ya abierto el programa, no funciona el argumento cuando se usa.

Para transferir datos (un string con los nuevos argumentos) a un proceso ya en ejecución, tienes varias opciones a tu disposición, bien puedes aplicar cualquier metodología conocida de intercomunicación entre procesos (IPC), como por ejemplo un bloque de memoria compartida (Memory-Mapped File):


( el algoritmo de creación, lectura y escritura de datos en el bloque de memoria lo implementarías en el evento Startup de tu aplicación WPF, o en otros eventos de inicio de la aplicación. )

O bien puedes declarar una clase con una propiedad que tenga por nombre "Argumentos", e implementar una notificación de cambio de esa propiedad mediante la interfaz INotifyPropertyChanged:


...luego solo sería cuestión de suscribirse al evento INotifyPropertyChanged.PropertyChanged para notificar de nuevos argumentos command-line recibidos en tu aplicación.

Aplicar cualquiera de las soluciones que he mencionado realmente no es dificil pero logicamente requiere entendimiento y conocimiento, si no comprendes como hacerlo no te preocupes por que aquí abajo publiqué un ejemplo de implementación de la interfaz INotifyPropertyChanged que precisamente está enfocado para demostrar lo que tú quieres hacer, es decir, una aplicación de única instancia que pueda recibir y notificar de nuevos argumentos recibidos por linea de comandos, pues aquí abajo tienes la solución ya hecha por mi y completamente funcional:


...eso sí, como puedes ver el código está escrito en VB.NET y es para Windows Forms, pero no deberías encontrar ninguna complicación si usas cualquier conversor online de código de VB.NET a C#, y luego para adaptar el código de WinForms a WPF pues simplemente debes averiguar como puedes reemplazar lo que hago en el evento de aplicación StartupNextInstance por el evento equivalente en WPF, que no estoy seguro de si podrá ser en el evento Startup, pero bueno, con ese código de VB.NET tienes el 99% del problema ya resuelto, ahora te toca poner de tu parte para investigar como adaptar el código a WPF, aquí tienes la información con respecto a todos los eventos disponibles en una aplicación WPF:


Con las indicaciones que te he dado debería ser suficiente, me refiero, implementar la interfaz INotifyPropertyChanged, no necesitas hacer más, aun así, por si te interesa aquí abajo publiqué un ejemplo de uso de la clase MemoryMappedFile para...


( logicamente el ejemplo requiriría pequeñas adaptaciones para cumplir con el propósito que le quieres dar, pero el concepto ahí lo puedes ver. )

Saludos.