2016-10-19 8 views
-1

wpf에서 콘솔을 열고 싶습니다. 프로그램을 닫지 않고 두 번 콘솔을 열려고했지만 두 번째로 프로그램이 손상되었지만 그렇지 않습니다. 정말 이유를 알고 난 당신이 새로운 콘솔 ReadLine()을 사용하여 다음 새 콘솔을 할당하고 유지하려는 경우 당신은 또한 Console 클래스의 입력 스트림을 재 할당해야 할 것 같습니다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

_ "프로그램이 고장"_ - 구체적으로 기재하십시오. 프로그램이 어떤 방식으로 충돌 했습니까? 응답을 멈췄습니까? 예외가 발생 했습니까? 그냥 사라졌어? 어떤 종류의 오류 메시지가있는 곳? 그렇다면 그들이 뭐라고 말 했나요? 예외가있는 경우 스택 추적은 무엇입니까? 질문을 개선하십시오. –

+0

게시 한 코드를 시도해 보았고 세 가지 다른 동작을 보았습니다. 때로는 콘솔과 전체 프로그램을 정지시킵니다. 때때로'ReadLine()'호출에서 예외를 throw합니다 :'핸들이 유효하지 않습니다'. 콘솔 API에 대해 충분히 알지 못하기 때문에 콘솔 API를 사용하는 방법이 아닌 것입니다. 게다가, 그것이 효과가 있었다고해도, 이것은 잘못된 행동입니다. GUI 프로그램이 있습니다. 콘솔을 보여주고 싶다면 자신의 창을 표시하고 목적에 맞게 창을 사용하십시오. –

답변

0

도움 싶어요 :

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 등)을 가지고 있습니다. 거의 어려움없이 확실히 way 관리되는 프로그램에서 관리되지 않는 호출이 섞이는 것과 관련된 익숙하지 않은 오류로 실행하는 것보다 덜 어렵지 만 콘솔 창에서 수행하는 모든 작업을 수행하는 창을 만들 수 있습니다. IMHO, 정말 옳은 길입니다.