Enviar accion a proceso especifico wpf

Iniciado por rigorvzla, 13 Junio 2018, 02:48 AM

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

rigorvzla

Hola , a todos, esta noche les traigo un problema que no puedo resolver, eh conseguido un codigo para lo que necesito pero en otro leguanje que no es wpf, el lenguaje es VB aunque no estoy seguro y me da el error siguiente el cual no puedo resolver.

"No se puede convertir un objeto de tipo string al tipo diagnostic.process"

y aqui el codigo
 Process p = (Process) listBox1.SelectedItem;
                   if (p != null)
                   {
                       IntPtr h = p.MainWindowHandle;
                       SetForegroundWindow(h);
                       simuladorTeclas.Keyboard.KeyPress(VirtualKeyCode.VK_A);
                   }

Esto consiste en seleccionar de un listbox un proceso y a ese proceso enviar la accion, que en este caso seria precionar la tecla "a"

Me podrian ayudar con el codigo que no allo como hacer para que me funcione y es creo , lo ultimo para que sirva, de antemano gracias.

Anexo, que el codigo de donde me estoy guiando funciona perfectamente

  Process p = (Process) listBox1.SelectedItem;
                    if (p != null)
                    {
                        IntPtr h = p.MainWindowHandle;
                        SetForegroundWindow(h);
                        simuladorTeclas.Keyboard.KeyPress(VirtualKeyCode.VK_A);
                    }

ejecutando esto desde un boton que es lo original

Eleкtro

#1
Cita de: rigorvzla en 13 Junio 2018, 02:48 AMeh conseguido un codigo para lo que necesito pero en otro leguanje que no es wpf

WPF no es un lenguaje, sino una tecnología con un framework para la creación de aplicaciones. Para el desarrollo de aplicaciones con interfaz gráfica basada en la tecnología WPF, se puede usar el lenguaje VB.NET + XAML, al igual que C# + XAML (como ya sabes). Aparte de esto, se puede usar el framework de WPF en Windows Forms, y viceversa.

Cita de: rigorvzla en 13 Junio 2018, 02:48 AMel lenguaje es VB aunque no estoy seguro

El código que has puesto no está escrito en VB.NET, sino en C#.

Cita de: rigorvzla en 13 Junio 2018, 02:48 AM
me da el error siguiente el cual no puedo resolver.

"No se puede convertir un objeto de tipo string al tipo diagnostic.process"

El mensaje de error es claro, lo que ocurre es que los elementos de tu ListBox son de tipo String, y no puedes convertir un String al tipo Process obviamente.

Dependiendo de si los elementos del ListBox hacen referencia a nombres de procesos o a sus identificadores de proceso (PID), puedes usar la función Process.GetProcessesByName() o Process.GetProcessById().

Documentación y ejemplos:

Saludos








rigorvzla

#2
Gracias como siempre por todas las aclaraciones y pronta respuesta, pero aun sigo sin saber como colocar lo que me has dejado en mi codigo ya que surgen mas errores,
Anexo esta informacion del codigo que olvide colocar y es importante tambien para la resolucion de el problema.
private void actualizar()
       {
           List<Process> listaprocesos = Process.GetProcesses().ToList();
           foreach (Process theprocess in listaprocesos)
           {
               listBox1.Items.Add(theprocess.ProcessName);
           }
       }

asi obtengo la lista de procesos en el listbox, mas no se ahora como hacer que esto me resulte bien en esta otra parte del codigo sin que me de el error de no poder convertir de string a process

if (speech == letraA)
               {
                   Process p = (Process) listBox1.SelectedItems;
                 
                   if (p != null)
                   {
                       IntPtr h = p.MainWindowHandle;
                       SetForegroundWindow(h);
                       simuladorTeclas.Keyboard.KeyPress(VirtualKeyCode.VK_A);
                   }
               }


Anexo error nuevo "System.InvalidCastException: 'No se puede convertir un objeto de tipo 'System.Windows.Controls.SelectedItemCollection' al tipo 'System.Diagnostics.Process'.'"

Eleкtro

#3
Cita de: rigorvzla en 13 Junio 2018, 14:59 PMno se ahora como hacer que esto me resulte bien en esta otra parte del codigo sin que me de el error de no poder convertir de string a process

Sinceramente creo que no has leido nada, te lo acabo de explicar...

Cita de: Eleкtro en 13 Junio 2018, 08:11 AM... lo que ocurre es que los elementos de tu ListBox son de tipo String, y no puedes convertir un String al tipo Process obviamente.

... si los elementos del ListBox hacen referencia a nombres de proceso ... puedes usar la función Process.GetProcessesByName() ...

Documentación y ejemplos:

Te voy a hacer una simple pregunta: ¿tú intención a largo plazo (digamoslo así) es aprender a programar en C#, o por lo contrario simplemente tienes este problema y quieres que te ayuden a resolverlo ya ya está?. En el primer caso, yo podría mostrarte el código pero así no aprenderías nada, en realidad la falta de comprensión hacia el problema/error por el que pides ayuda simplemente se debe a un problema que requiere nociones básicas para poder solucionarlo, me refiero, un dominio (muy) básico de principiante, así que por mi parte en vez de mostrarte el código/la solución prefiero recomendarte que busques y leas cualquier guía/libro de .NET/C# para principiantes, o que al menos leas el artículo de MSDN y así al menos aprenderás como usar la ya mencionada función GetProcessesByName()... no creo que cueste tanto leer, y si no entiendes el ejemplo en C# que hay en el artículo de MSDN pues no creo que vayas a etender ningún otro ejemplo que te mostremos nosotros, la verdad, así que insisto en recomendarte que leas cualquier tutorial de .NET o C# para principiantes por que de seguro te enseñará bien a comprender por que tienes ese error... y como solucionarlo, aunque ambas cosas el motivo del error y como solucionarlo ya lo expliqué en mi comentario anterior... pero te falta comprender como puedes aplicar lo que te expliqué, y eso requiere un nivel mínimo de aprendizaje.

Si por lo contrario no te interesa aprender C# y solo buscas que te resuelvan el código, confírmalo y entonces te mostraré la solución sin ningún inconveniente (si no lo muestra cualquier otra persona antes que yo, vaya).

...de todas formas eso del error de convertir un string a la clase Process no es el problema más grave que tienes, me explico: ¿has pensado que ocurrirá al añadir en la colección del ListBox más de un elemento/proceso con el mismo nombre? (ya sean múltiples instancias de un proceso, o dos executables distintos con el mismo nombre), ¿cómo vas a saber en esas circunstancias cual proceso es cual solo por su nombre?, no puedes identificar un proceso por su nombre si hay más de uno con el mismo nombre, por ende tienes un fallo de diseño bien grande en el código. Para solucionarlo, en vez de esperar obtener un proceso individual, debes obtener un Array de procesos que tengan el mismo nombre (por todo esto que acabo de explicar es que la función se llama Process.GetProcessesByName() y no Process.GetProcessByName()), o bien en lugar de manejarte solamente con nombres de procesos te manejas con el identificador numérico del proceso (más conocido por sus siglas en Inglés: PID) ya que el identificador del proceso o PID no se puede repetir entre procesos y así siempre te asegurarás de obtener un único proceso, bueno, cuando digo un único proceso me refiero a una única instancia de la clase Process.

Saludos








rigorvzla

hola elektro, quiero ambas cosas pero de momento me inclino por la primera, y es investigar para aprender lo que me estas enseñando, leere con mas detenimiento y me informare mas, ya seria a ultima instancia que pedirira una explicacion de un conocedor del tema a pronfundidad como tu y  con el codigo, gracias por que en tiempos anteriores , no hubiera entendido esta ayuda tuya.

La cosa como tal es que no se como aplicar exactamente el metodo en el codigo ahi es donde debo ver bien como se usa el Process.GetProcesessByName();

Gracias nuevamente, regresare publicando como resolvi esto o pidiendo ayuda gracias por la paciencia.