2013-10-07 2 views
-2

Я видел пример C#, используя функцию API ConsoleRead, но когда я попытался перевести его в VBNET, я получаю много ошибок, а также на других сайтах, таких как pinvoke, уникальный пример для C# тоже, я не могу найти любая хорошая информация для функции VBNET of ConsoleRead API (если существует способ читать буфер консоли без APIS, тогда я не знаю).Как читать буфер консоли в VBNET?

Также я пробовал этот буфер чтения буфера для класса VBNET (http://pastebin.com/XYxakDTV), но он выдает необработанное исключение с сообщением типа «Контроллер недействителен».

Кто-нибудь может проиллюстрировать меня и всех других людей примером для VBNET о том, как запустить процесс из приложения GUI (WindowsForm), чтобы прочитать вывод консоли для извлечения символов/строк?

UPDATE:

Я не уверен, но я думаю, что запущенный процесс (с использованием System.Process Class) не назначает консоль к приложению, так что я думаю, что все примеры видели здесь в MSDN не могли бы мне помочь: http://msdn.microsoft.com/en-us/library/system.console.aspx

+0

Как начать процесс? Я бы ожидал, что вы можете сделать это с перенаправлением потока, без необходимости * P/Invoke, в конце концов ... –

+0

@Rowland Shaw Привет, Я запускаю процесс, как обычно, процесс имеет свой собственный прогрессбар и в то время как прогресс не заполнен процессом, я не могу прочитать всю строку (строка строки прогресса CLI), поэтому мне нужно прочитать символ по символу вывода консоли для получения прогресса, я решил, что эта проблема читает символ char с помощью потока читатель, но у меня другая проблема не решена, вывод ошибки процесса не может быть прочитан (по крайней мере, я пробовал много вещей, но не могу его прочитать), поэтому я надеюсь, что прочитав его из буфера консоли, я смог бы прочитать любой (кроме ввода) – ElektroStudios

ответ

2

Использование

StandardOutput.Read 

Я думаю, что ответ такой же, как и для другого вопроса Run a commandline process and get the output while that process still running?

Редактировать, вы запрашиваете приложение формы для чтения вывода на консоль. Итак, давайте добавим консольное приложение():

Module Module1 

    Sub Main() 
     While True 
      ' data = Console.ReadKey.KeyChar 
      Dim Generator As System.Random = New System.Random() 
      Console.Write(Generator.Next(0, 100) & " ") 
      Threading.Thread.Sleep(1000) 
     End While 
    End Sub 

End Module 

Он генерирует пробелы, разделенные пробелами, один раз в секунду. Теперь приложение форм. Давайте иметь форму с многострочного TextBox имени txtResult и buttoncmdStart:

Private Sub cmdStart_Click(sender As Object, e As EventArgs) Handles cmdStart.Click 
     Dim ProcInfo As New ProcessStartInfo With 
      {.FileName = "DataApp.exe", .RedirectStandardOutput = True, .UseShellExecute = False} 
     Dim proc As Process = Process.Start(ProcInfo) 

     While Not proc.HasExited 
      Dim a As String = ChrW(proc.StandardOutput.Read) 
      If a = " " Then 
       txtResult.Text &= vbCrLf 
      Else 
       txtResult.Text &= a 
      End If 
      Threading.Thread.Sleep(100) 
      Application.DoEvents() 
     End While 

    End Sub 

Он записывает цифры в TextBox один на линии. Магии API нет, но она работает.

+1

Привет, конечно, я могу читать вывод, но не буфер, также метод «Чтение» предназначен для чтения по одному на один символ, он возвращает только одно целочисленное значение, которое должно быть преобразуется в символ, поэтому код с использованием строки variab le в другом ответе совершенно неверен, потому что на выходе будет много numebrs, а не символов ... в любом случае я знаю, как это сделать, но это не то, о чем я просил, как читать буфер (где, я полагаю, все выходы объединены в этот буфер), но на самом деле благодарю вас. В любом случае, мой английский. – ElektroStudios

+2

@ElektroHacker Вы пишете о чтении буфера, это означает сериализованные данные. Необходимость разбора чисел из строк раздражает, но разрешима и не слишком сложна. – IvanH

Смежные вопросы