API para manipular VS

Iniciado por zonahurbana, 26 Julio 2015, 19:09 PM

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

zonahurbana

Me pregunto si existe alguna librería para manejar comandos sobre Visual Studio.

Hace poco me enteré de la existencia de un programa llamado "asistente Jarvis" que a través de reconocimiento de voz permite que ejecutemos comandos hablando por el micro... a cambio sucede alguna acción y/o recibimos además una "respuesta hablada".

Estuve buscando un poco y según veo es relativamente sencillo (en comparación a cómo creí yo que sería) crear un programa con reconocimiento de voz usando System.Speech.

Entonces, quisiera crear un asistente que nos ayude en el desarrollo.

El programa que menciono permite hacer búsquedas en los buscadores más conocidos, abrir carpetas (hay que agregarlas manualmente), ejecutar programas (también hay que agregarlos seleccionando el .exe), escribe lo que le dictamos, lee lo que le indicamos, etcétera.

Pero lo que yo quiero conseguir es algo como lo siguiente:
Citar- "Usar reconocimiento del lenguaje C#"
* "Reconociendo lenguaje C#"

- "Ir a la línea 36"
* "Estamos en la línea 36"

- "Crear un método estatíco que devuelva un objeto de tipo String"
* "Método estático creado"

- "Ir a la clase FormPrincipal"
* "Estamos en la clase FormPrincipal"

- "Ubicar el método actualizarTabla"
* "Método ubicado"

- "Copiar el contenido"
* "Se ha copiado el contenido del método actualizarTabla"

Y bueno, sería de agregar un diccionario para poder indicarle que defina variables, cree clases, objetos, y que el asistente conozca la sintaxis según el lenguaje que se le indique.

La verdad es que, programar sin usar el teclado/mouse sería excelente.
De hecho, tendríamos más tiempo para dedicarnos en pensar la lógica que escribir o tener que ubicarnos en una pos determinada. Para mí resulta cansado tener que ubicar una pestaña o abrir una clase. Es decir, es una acción pequeña pero haciéndolo tantas veces, el tiempo total consumido debe ser mucho  ;D

He buscado comandos de visual studio, y hay algunas combinaciones que permiten ir a la siguiente pestaña. Esto creo que lo puedo hacer, haciendo que se "presionen ciertas teclas".

Pero, por ejemplo, si quiero ubicar una clase (entre los archivos de mi solución), la verdad es que no tengo idea.

Por favor, espero puedan ayudarme...  ;-)
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Eleкtro

#1
CitarAPI para manipular VS

La API para manipular internamente Visual Studio es su SDK, la cual es gratuita.

Para ir aprendiendo lo básico, échale un vistazo a estos enlaces:
Manuales de .NET

Cita de: Elektro⇲ Visual Studio SDK




Cita de: zonahurbana en 26 Julio 2015, 19:09 PMHe buscado comandos de visual studio, y hay algunas combinaciones que permiten ir a la siguiente pestaña. Esto creo que lo puedo hacer, haciendo que se "presionen ciertas teclas".

A lo que realmente te estás refiriendo son combinaciones de teclado de acceso rápido, hotkeys.

Los comandos existentes en Visual Studio que invocan un verbo/acción, puedes utilizarlos de dos maneras:

1. Usando la SDK de Visual Studio, es decir, programando. (pero te advierto que para un principiante en la SDK, resulta MUY complejo al principio)

2. Escribiendo el nombre del comando en la ventana de comandos, a la que puedes acceder desde el menú View -> Other Windows -> Command Window o con el hotkey Control+Alt+A.

Aquí tienes una breve lista de algunos comandos de la IDE:
Visual Studio Commands - MSDN

Para ver la lista completa (incluyendo los comandos ocultos o añadidos por extensiones de terceros) debes mirarlo desde las opciones de la IDE, en el menú Tools -> Options... -> Environment -> Keyboard, por defecto hay alrededor de 4.000 comandos disponibles para el disfrute, casi nah :P.




Lo que te voy a explicar es la forma de hacerlo mediante los comandos, usando la SDK de Visual Studio sería muy distinto, aunque por otro lado, también puedes recurrir a la utilización de comandos usando la SDK si lo prefirieses así.

Citar- "Ir a la línea 36"
* "Estamos en la línea 36"
Comando Edit.GoTo "36"


Citar- "Ir a la clase FormPrincipal"
* "Estamos en la clase FormPrincipal"
Si la class se llama de la misma manera que el archivo, entonces con el comando File.OpenFile "FormPrincipal.vb".
Para buscar un nombre, el comando Edit.Find "FormPrincipal" + Edit.FindNext


Citar- "Ubicar el método actualizarTabla"
* "Método ubicado"
Comando Edit.Find "actualizarTabla" + Edit.FindNext


Citar- "Copiar el contenido"
* "Se ha copiado el contenido del método actualizarTabla"
Comando Edit.LineDownExtend hasta que Linea.TrimStart.StartsWith("End Sub") o Linea.TrimStart.StartsWith("}") para C#;
por último, comando Edit.Copy.

En C# sería una tarea más tediosa, por que el bracket de cierre se puede colocar tanto al pricnipio de una linea vacía como al final de una instrucción:
Código (csharp) [Seleccionar]
private void MyMethod() {
   code;}



Citar- "Crear un método estatíco que devuelva un objeto de tipo String"
* "Método estático creado"
Obviamente no existe comando para una tarea tan particular, debes programar el algoritmo.


Citar- "Usar reconocimiento del lenguaje C#"
* "Reconociendo lenguaje C#"
Para el parsing/reconocimiento de los lenguajes de la plataforma .Net, puedes usar el motor Roslyn, que es el mismo que usa Visual Studio, y también es gratuito (y Open Source).

Aunque si te estás refiriendo a utilizar la voz para escribir código con la sintaxis de C#, pues no hay nada que te ayude más que desarrollar tu propio intérprete/traductor para reconocer la voz y luego indicar los caracteres que se deben typear...




Cita de: zonahurbana en 26 Julio 2015, 19:09 PMLa verdad es que, programar sin usar el teclado/mouse sería excelente.

Solo la teoría suena excelente, por que la práctica sería una auténtica ruina insufrible, a menos que se quiera hacer un "Hola mundo" y ya está.

Las manos trabajan mejor que la voz en muchos casos, por ejemplo al escribir operaciones aritméticas, o al copiar y pegar cadenas de texto o bloques de código.

Y si no, ponte a deletrear cualquier cifra empezando por una cifra pequeña como por ejemplo los primeros decimales del número PI, comparándolo con el tiempo en que eres capaz de escribirlo:
Código (csharp) [Seleccionar]
float pi = 3.1415926536f;
(eso es solo un pequeñísimo ejemplo de demostración, mucho más se tardaróa en "programar" una operación aritmética compleja, claro está).

Cita de: zonahurbana en 26 Julio 2015, 19:09 PMDe hecho, tendríamos más tiempo para dedicarnos en pensar la lógica que escribir o tener que ubicarnos en una pos determinada.

Quítale todo a esa frase y deja el "más tiempo", en eso se resumiría la idea, en consumir más tiempo (del que realmente sería necesiario, usando las manos).

Pero bueno, si a ti te gusta no te lo discuto, quizás tu puedas sacarle provecho a tu idea.

Un saludo!








zonahurbana

#2
Cita de: Eleкtro en 26 Julio 2015, 19:48 PM
A lo que realmente te estás refiriendo son combinaciones de teclado de acceso rápido, hotkeys.

Los comandos existentes en Visual Studio que invocan un verbo/acción, puedes utilizarlos de dos maneras:

1. Usando la SDK de Visual Studio, es decir, programando. (pero te advierto que para un principiante en la SDK, resulta MUY complejo al principio)

2. Escribiendo el nombre del comando, en la ventana de comandos, a la que puedes acceder desde View -> Other Windows -> Command Window o con el hotkey Control+Alt+A.
He ejecutado algunos de los comandos que usted menciona y sí que funcionan. Pero, ¿en qué casos usaríamos la ventana de comandos?
Es decir, lo que deseo es incluir la funcionalidad de los comandos en un programa. ¿Es posible usar los comandos tal cual dentro de un programa y hacer que se ejecuten sobre el Visual Studio activo?

¿O para esto último la única opción posible es usar la SDK?


Cita de: Eleкtro en 26 Julio 2015, 19:48 PM
Obviamente no existe comando para una tarea tan particular, debes programar el algoritmo.
Soy consciente de ello, pero primero tendría que conocer bien cómo ejecutar los comandos desde un programa (probablemente en C#).
Por ejemplo, si aprendo a escribir cosas sobre el clipboard, ir a una línea y pegar, podría hacerlo.


Cita de: Eleкtro en 26 Julio 2015, 19:48 PM
No se a que te refieres exactamente, ¿reconocimiento de C# usando lo voz?, no lo entiendo, pero para el parsing/reconocimiento de los lenguajes de la plataforma .Net, puedes usar el motor Roslyn, que es el mismo que usa Visual Studio, y también es gratuito (y Open Source).
Solo me refiero a que usando C# (supongo de la misma forma funciona con VB u otros) es posible reconocer lo que se dice por un micrófono y según ello actuar. Yo creí que sería un tema más complicado o que el reconocimiento sería muy deficiente, pero es bueno jeje.


Cita de: Eleкtro en 26 Julio 2015, 19:48 PMLas manos trabajan mejor que la voz en muchos casos, por ejemplo al escribir operaciones aritméticas, o al copiar y pegar cadenas de texto o bloques de código.
Si para programar una parte en específico es conveniente escribirlo, pues simplemente lo haría, luego continuaría usando el programa que escribe/busca por mí.
Seguro que sí, las manos trabajan mejor, pero hay que estar concentrado con la vista viendo dónde hacemos click o buscando una pestaña a donde ir. Al programa le diría algo como "ve a la clase tal y ubica el método tal". Estando allí ya podría escribir sin complicaciones, o bien podría "dictarle" que declare una variable X de tipo Y.
Nunca dejar de aprender es importante, más allá del ritmo que se siga ...

Eleкtro

#3
Cita de: zonahurbana en 26 Julio 2015, 20:45 PM
He ejecutado algunos de los comandos que usted menciona y sí que funcionan. Pero, ¿en qué casos usaríamos la ventana de comandos?
Es decir, lo que deseo es incluir la funcionalidad de los comandos en un programa. ¿Es posible usar los comandos tal cual dentro de un programa y hacer que se ejecuten sobre el Visual Studio activo?

¿O para esto último la única opción posible es usar la SDK?

Claro, te hablé sobre los comandos por que es la alternativa sencilla, solo tienes que darle foco a la instancia de Visual Studio (pero recuerda que es una aplicación multi-instancia así que deberás manejarte con eso), una vez la ventana esté activa puedes simular la pulsación de la combinación Contorl+Alt+A (como lo estés haciendo en tu código) para mostrar y activar la ventana de comandos, y pur último simular las pulsaciones del teclado que desees para escribir el nombre del comando y los argumentos que éste toma.




Cita de: zonahurbana en 26 Julio 2015, 20:45 PMsi aprendo a escribir cosas sobre el clipboard, ir a una línea y pegar, podría hacerlo.

En cualquier aplicación puedes hacerlo al menos de dos maneras (a falta de poder usar otras técnicas IPC), la primera y más sencilla sería enviando pulsaciones del teclado a la ventana en cuestión,
la manera compleja (pero muchísimo más eficiente) sería localizando el control en la UI para modificar su texto (eliminarle, añadirle, etc), haciendo un espionaje (App-Spy) a la aplicación.

Para la segunda manera puedes utilizar Microsoft UI Automation (o en su defecto la API de Windows, funciones FindWindowEx, EnumChildWindows, SendMessage, etc), en los miembros del namespace System.Windows.Automation, pero cada aplicación es un mundo con estructura distinta, classnames distintos, etc, así que cada aplicación requeríra un análisis personalizado. Es bastante tedioso.

El Notepad está bastante explotado en ese sentido por que es la aplicación con la que se suele experimentar el App-Spy, así que no creo que encuentres complicaciones para buscar y encontrar información al respecto si buscas por sus classnames en Google, aunque de todas formas puedes obtener toda la información que necesites de una aplicación por ti mismo con las herramientas de Microsoft UI Automation que puedes encontrar en el interior del paquete de la SDK de Windows, u otras herramientas de terceros como WinSpy o Xaml Spy.

Lo de ir a una linea ya lo veo mucho más complicado, al menos no se me ocurre como hacerlo con el notepad.

Nota: Recuerdo que en el Notepad, el nombre de la ventana a la que le puedes enviar texto (texto, no confundir con pulsaciones) se llama "EDIT".




Cita de: zonahurbana en 26 Julio 2015, 20:45 PMSolo me refiero a que usando C# (supongo de la misma forma funciona con VB u otros) es posible reconocer lo que se dice por un micrófono y según ello actuar. Yo creí que sería un tema más complicado o que el reconocimiento sería muy deficiente, pero es bueno jeje.

¡Aaah, bueno!, en ese caso si, por supuesto que puedes:

Get Started with Speech Recognition - MSDN
System.Speech.Recognition - MSDN
Speech recognition, speech to text, text to speech, and speech synthesis in C# - CodeProject
Google

Nota: Aunque, debo decirte que este tema nunca lo he llegado a investigar ni mucho menos a practicar, así que no puedo ayudarte mejor respecto a ese tema.



Que tengas suerte y ánimos con la idea y el desarrollo.

Saludos!