У меня длинное консольное приложение, которое начинается с Windows или может быть запущено приложением, которое я пишу.Текст ввода и вывода из долгого консольного приложения (C++)
У меня был ограниченный успех при отправке ключей в консольное приложение, и даже не знаю, с чего начать для чтения вывода из него. Является ли чтение вывода из консольного приложения, которое даже не запускается запрашивающим приложением, даже возможно?
В любом случае, два вопроса ...
Как эмулировать ключ "возврата"? (Вот что я должен передать определенные ключи к приложению, и приложение делает получить ключи, но я не могу найти, как эмулировать клавишу ENTER.
do {
hwndCurrentWindow = FindWindowA("ConsoleWindowClass", "My Other Console App");
if (hwndCurrentWindow == 0) {
break;
}
iStringLen = GetWindowTextW (hwndCurrentWindow, wcharWindowText, 500);
if (iStringLen == 0) {
continue;
}
SetActiveWindow(hwndCurrentWindow);
printf("Sending '?'");
SendMessage(hwndCurrentWindow, WM_CHAR, '?', 0);
// '?' shows up in console app
printf("Sending 'a'");
SendMessage(hwndCurrentWindow, WM_CHAR, 'a', 0);
// 'a' shows up in console app.
//printf("Sending RETURN");
//SendMessage(hwndCurrentWindow, WM_CHAR, VK_RETURN, 0);
// nothing happens
break;
} while (hwndCurrentWindow);
Как я могу прочитать данные из консольное приложение? (Если другое консольное приложение не запускалось непрерывно, я бы просто записал вывод в файл и прочитал, что в ... черт может все еще работать)
Я рассмотрел несколько вариантов, но многие из тех, что я читал, для C#, и, к сожалению, у меня нет роскоши менять языки. Существуют ли какие-либо аналогичные варианты для C++?
Collect stdout output from a console app with C++ Это не работает, потому что приложение не уходит. Так что это просто зависает и ждет. Непрерывное добавление в буфер.
Capturing an c# executable output from another C# program
Спасибо за любую помощь вы можете предоставить!
Спасибо! Я видел еще одну статью MSDN (http://support.microsoft.com/kb/190351) о любых мыслях по этому поводу? –
В основном они делают то же самое. Точка, с которой вам нужно внимательно следить, это вызов функции CreateProcess() и параметры для использования. Вам нужно будет создать набор труб, а затем указать в CreateProcess(), чтобы они были использованы для связи между вашим приложением и процессом, который вы создаете. Я уверен, что вы можете взять любой пример, чтобы получить нужные результаты. – Bogolt
Это действительно помогло! У меня был большой успех. Я использовал PID, чтобы убить приложение, когда мое приложение заканчивается, и может захватить вывод из консольного приложения, но не успел отправить какие-либо данные с помощью команды WriteToPipe. Даже при поставке допустимого пути файла ничего не посылает, я помещаю в маленькой команде «Сон», чтобы убедиться, что она была запущена, прежде чем пытаться отправить данные, или, возможно, я не вижу отправленные данные, потому что сообщение не отправляется. Любые идеи о том, как отправить строку в g_hChildStd_IN_Wr? Или это то, что канал g_hChildStd_IN_Rd? Это используется один раз. Обои из-текста. –