2016-10-19 3 views
-1

Я хочу открыть консоль в wpf, я пытался открыть консоль дважды, не закрывая программу, но во второй раз программа разбилась, я не на самом деле знает, почему, и я хотел бы помочьКонсоль разбилась, когда я пытаюсь открыть ее дважды в wpf

using System; 
using System.Windows; 
using System.Runtime.InteropServices; 

namespace WpfApplication1 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     [DllImport("Kernel32")] 
     public static extern void AllocConsole(); 

     [DllImport("Kernel32")] 
     public static extern void FreeConsole(); 

     private void button_Click(object sender, RoutedEventArgs e) 
     { 
       AllocConsole(); 
       string x = Console.ReadLine(); 
       FreeConsole(); 
     } 
    } 
} 
+2

_ «программа разбилась» _ - будьте конкретны. Каким образом программа «врезалась»? Это просто перестало отвечать? Вызывает ли это исключение? Это просто исчезло? Где какие-либо сообщения об ошибках? Если да, то что они сказали, _exactly_? Если возникло исключение, какова была трассировка стека? Пожалуйста, улучшите свой вопрос. –

+0

Я пробовал код, который вы отправили, и я получаю три разных поведения: иногда он отлично работает; иногда он висит консоль, и, следовательно, вся программа; и иногда он вызывает исключение в вызове 'ReadLine()': дескриптор недействителен'. Я не знаю достаточно о API-интерфейсе консоли, чтобы объяснить, почему то, что вы делаете, само по себе неправильно, но, похоже, это не то, как вы ожидаете использовать консольный API. Более того, я бы сказал, даже если это сработало, это неправильно. У вас есть программа GUI; если вы хотите показать консоль, отобразите собственное окно и используйте его для этой цели. –

ответ

0

Похоже, вам необходимо также перераспределить входной поток Console класса, если вы хотите, чтобы выделить новую консоль, а затем с помощью ReadLine() для этой новой консоли:

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    AllocConsole(); 

    using (Stream stream = Console.OpenStandardInput()) 
    using (TextReader reader = new StreamReader(stream)) 
    { 
     string x = reader.ReadLine(); 
    } 

    FreeConsole(); 
} 

Это, я думаю, вы действительно возглавляете неправильные направление с этим. Окно консоли - чрезвычайно ограниченное средство для взаимодействия с пользователем. Именно поэтому у нас есть программы GUI (Winforms, WPF и т. Д.). С очень небольшими трудностями и, конечно же, менее сложным, чем работа с незнакомыми ошибками, связанными с смешиванием неуправляемых вызовов в вашей управляемой программе, вы можете создать окно для своей программы, которое делает все, что делает консольное окно, но делает это лучше. ИМХО, это действительно правильный путь.