C# - Симуляция ввода текста пользователем в консольное приложение

197
01 мая 2019, 11:50

Задача такова, на фоне работает консольное приложение, мое приложение при нажатии на кнопку симулирует ввод текста в этом консольном приложении, то есть по факту команду в консоль отправляет не пользователь а программа.

Пример: Пользователь нажал кнопку "Вывести текст test", и в работающем приложении напечаталась команда "echo test" и отправилась. (Это не обязательно cmd, может быть любое другое консольное приложение)

Вопрос - Как это возможно реализовать и возможно ли?

Answer 1

Посылает текст textToSend на апликуху с ЗАГОЛОВКОМ процесса processTitle. Не важно оно консольное или WinForm.

[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
public void SendTextToProcess(string processTitle, string textToSend)
{
    IntPtr zero = IntPtr.Zero;
    for (int i = 0; (i < 10) && (zero == IntPtr.Zero); i++)//Пытается найти окно
    {
        Thread.Sleep(300);
        zero = FindWindow(null, processTitle);
    }
    if (zero != IntPtr.Zero)
    {
        SetForegroundWindow(zero);//делает окно активным (например консоли)
        SendKeys.SendWait(textToSend);//посылает нужные нажатия клавиш
        SendKeys.Flush();
    }
}

Пример использования:

SendTextToProcess("Untitled - Notepad", "hello World{ENTER}Tab{TAB}{TAB}test{TAB}{TAB}finished{ENTER}");

Напечатает в открытом пустом блокноте:

hello World
Tab     test        finished

Если же для тебя важно отправлять месаджи именно в бекграунде (без того что бы делать окно активным), то тебе нужно смотреть в сторону PostMessage и SendMessage. Есть вот такая вот библиотека https://github.com/EasyAsABC123/Keyboard которая реализует этот функционал.

Важный нюанс работы с SendMessage описан вот в этой теме: Напечатать символ в неактивное окно?

READ ALSO
Как передать в С++ библиотеку указатель на объект из C# и затем получить данные обратно?

Как передать в С++ библиотеку указатель на объект из C# и затем получить данные обратно?

Дело такое: Написал несколько функций на С++ и хочу их использовать в C# коде, но не знаю как правильно объявить эти функции в C#

178
Как пролистать Panel через AutoScroll кнопкой?

Как пролистать Panel через AutoScroll кнопкой?

Подскажите, как при нажатии на кнопку пролистать Panel через AutoScroll, таким образом, чтобы пролистывание уходило в самый конец Panel

199
Ошибка при получении пользователя из Active Directory c#

Ошибка при получении пользователя из Active Directory c#

Подскажите, выходит ошибка при получении пользователя из AD: "Ссылка на объект не указывает на экземпляр объекта"Хотя на компе где пишется...

185
Парсинг json полей с точками как классов

Парсинг json полей с точками как классов

Имеется json примерно такого типа:

179