Управление приложением из другого приложения для голосовых команд
Привет всем ,мой мотив состоит в том, чтобы управлять visual studio с помощью голосовых команд с помощью microsoft speech services.
Я хочу управлять visual studio из моего другого приложения window form на c#. У меня есть небольшой успех, но есть некоторые проблемы в SendKeys для приложения.
Как я уже открыл два экземпляра visual studio. когда я запускаю свою программу из visual studio , она работает нормально. я даю команду Ctrl+N (^n), используя клавиши отправки для добавления нового диалогового окна файла. При запуске моей программы элемент управления переходит в другой экземпляр и открывает диалоговое окно добавить новый файл . это хорошо работает .
Но когда я запускаю exe непосредственно из папки bin, он не отправляет ключи в экземпляр Visual studio. Exe хорошо находит окно visual studio, но не открывает диалоговое окно файла. Существует некоторая проблема для метода setForgroundWindow(handel).
Что я уже пробовал:
using System; using System.Runtime.InteropServices; using System.Windows.Forms; namespace ControlVs { public partial class Form1 : Form { IntPtr handle = new IntPtr(0); [DllImport("User32.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { handle = FindWindow(@"HwndWrapper[DefaultDomain;;f515415e-f7ae-41b2-b5fd-11635f9b28a9]", null); ShowWindow(handle, 5); label1.Text = Convert.ToString(handle); if (SetForegroundWindow(handle)) { System.Threading.Thread.Sleep(1000); /* * Send "Hello World!" to the active windows. * Then send TAB key to skip to the button. * Send ENTER key means press the button there. */ // SendKeys.Send(@"^{v}"); SendKeys.SendWait(@"^{n}"); // SendKeys.SendWait("{H}{e}{l 2}{o} {W}{o}{r}{l}{d}{!}"); // SendKeys.SendWait("{TAB}"); //SendKeys.SendWait("{ENTER}"); } } } }
namespace ControlVs { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.button1 = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(108, 97); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "button1"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(382, 106); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(18, 13); this.label1.TabIndex = 1; this.label1.Text = "HI"; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); this.Controls.Add(this.label1); this.Controls.Add(this.button1); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.Label label1; } }
Amit Saini
FindWindow(@"HwndWrapper[DefaultDomain;;f515415e-f7ae-41b2-b5fd-11635f9b28a9]", null);
это мое имя класса экземпляра visual studio . вы можете найти имя класса с помощью spy++
BillWoodruff
Вы проверили различные доступные инструменты:
https://www.google.com/search?sxsrf=ALeKk032jjOHSUfDqYUQowT74OMIBa2NRA%3A1596374858101&ei=Sr8mX7vYBcH79QPBhJroBQ&q=c%23+voice+control+visual+studio&oq=c%23+voice+control+visual+studio&gs_lcp=CgZwc3ktYWIQAzIICCEQFhAdEB4yCAghebyqhraemggiiraweb0qhjiicceqfhadeb4ycaghebyqhraemggiiraweb0qhjiicceqfhadeb46bagaeec6bggaeacqhjoicaaqbxafeb46cagaeagqbxaeogyiabaieb46bagheapq3ombwktpawdz_gfoanabeacaac0biahkcpibbje1ljaumzgbakabaaobb2d3cy13axraaqe&sclient=psy-ab&ved=0ahUKEwi7peHiz_zqAhXBfX0KHUGCBl0q4dudcaw&uact=5
Amit Saini
Да, я пробовал эти инструменты голосовых команд. Он основан на библиотеке распознавания речи windows, а не на речевом api Microsoft. Поэтому он не понимает так хорошо, как когнитивные службы для понимания произношения моего голоса.
Amit Saini
Я немного близок к своему проекту. Я использовал когнитивные сервисы Microsoft. Использовать его.Но проблема заключается в setForgroundWindow. Я думаю, что мне нужно добавить когнитивные сервисы Microsoft в текущий рабочий проект для управления разработкой для работы над проектами компании, а не с помощью другого приложения. я сохраню две копии с голосовыми командами проектов и без них.
Теперь мне придется основать автоматизированный браузер, чтобы я мог писать код и искать в google с помощью голосовых команд, чтобы мне не нужно было сидеть на стульях в течение 8 часов для программирования.
Gerry Schmitz
Таргетируйте приложение, предназначенное для автоматизации. Азбука Морзе не требуется.