2013-07-06 4 views
0

У меня длинное консольное приложение, которое начинается с 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++ Это не работает, потому что приложение не уходит. Так что это просто зависает и ждет. Непрерывное добавление в буфер.

Catch console input-output

Capturing an c# executable output from another C# program

Спасибо за любую помощь вы можете предоставить!

ответ

1

Вам необходимо перенаправить ввод/вывод из этого приложения в основное приложение. Вот статья о том: Creating a Child Process with Redirected Input and Output

+0

Спасибо! Я видел еще одну статью MSDN (http://support.microsoft.com/kb/190351) о любых мыслях по этому поводу? –

+1

В основном они делают то же самое. Точка, с которой вам нужно внимательно следить, это вызов функции CreateProcess() и параметры для использования. Вам нужно будет создать набор труб, а затем указать в CreateProcess(), чтобы они были использованы для связи между вашим приложением и процессом, который вы создаете. Я уверен, что вы можете взять любой пример, чтобы получить нужные результаты. – Bogolt

+0

Это действительно помогло! У меня был большой успех. Я использовал PID, чтобы убить приложение, когда мое приложение заканчивается, и может захватить вывод из консольного приложения, но не успел отправить какие-либо данные с помощью команды WriteToPipe. Даже при поставке допустимого пути файла ничего не посылает, я помещаю в маленькой команде «Сон», чтобы убедиться, что она была запущена, прежде чем пытаться отправить данные, или, возможно, я не вижу отправленные данные, потому что сообщение не отправляется. Любые идеи о том, как отправить строку в g_hChildStd_IN_Wr? Или это то, что канал g_hChildStd_IN_Rd? Это используется один раз. Обои из-текста. –