2017-03-05 2 views
0

Window가 있고 명령을 가진 WFA 프로그램이 있습니다. AllocConsole()을 사용하여 창을 엽니 다. 콘솔 창을 닫을 때 FreeConsole()을 사용합니다. 하지만 다시 AllocConsole(); 나는 그것에 쓰고 읽고 싶다. 그리고 예외를 던진다. 코드 : 핸들이 잘못되었습니다 :이가 mscorlib.dll 추가 정보 'System.IO.IOException'을 밖으로 던졌습니다폼 응용 프로그램에서 콘솔 창을 사용할 때 예외가 발생했습니다.

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using System.Management; 
using System.Management.Instrumentation; 
using System.Collections.Specialized; 
using System.Threading; 
using System.Runtime.InteropServices; 


    namespace WindowsFormsApplication2 
{ 

class classx 
{ 

    [DllImport("kernel32.dll")] 
    public static extern Int32 AllocConsole(); 
    [DllImport("kernel32.dll")] 
    public static extern bool FreeConsole(); 
    [DllImport("kernel32")] 
    public static extern bool AttachConsole(); 
    [DllImport("kernel32")] 
    public static extern bool GetConsoleWindow(); 
    public static bool z = false; 
    [DllImport("kernel32")] 
    public static extern bool SetConsoleCtrlHandler(HandlerRoutine HandlerRoutine, bool Add); 
    public delegate bool HandlerRoutine(uint dwControlType); 
} 



public partial class Form1 : Form 
{ 
    NotifyIcon icontask; 
    Icon iconone_active; 
    Icon iconone_inactive; 
    /*Icon icontwo; 
    Icon iconthree; 
    Icon iconfour; 
    Icon iconfive;*/ 
    Thread Threadworkermy; 

    public Form1() 
    { 
     InitializeComponent(); 
     this.WindowState = FormWindowState.Minimized; 
     this.ShowInTaskbar = false; 
     iconone_active = new Icon(".../iconone_active.ico"); 
     iconone_inactive = new Icon(".../iconone_inactive.ico"); 
     icontask = new NotifyIcon(); 
     icontask.Icon = iconone_active; 
     icontask.Visible = true; 
     Threadworkermy = new Thread(new ThreadStart(checkActivityThread)); 
     Threadworkermy.Start(); 

     MenuItem Nameapp = new MenuItem("xr"); 
     MenuItem quitappitem = new MenuItem("quit program"); 
     MenuItem OpenGUI = new MenuItem("Open GUI"); 
     MenuItem Advancedmodewindow = new MenuItem("x"); 
     ContextMenu contextmenu = new ContextMenu(); 

     quitappitem.Click += quitappitem_click; 
     OpenGUI.Click += OpenGUI_click; 
     Advancedmodewindow.Click += Advancedmodewindow_click; 
     contextmenu.MenuItems.Add(Nameapp); 
     contextmenu.MenuItems[0].Enabled = false; 
     contextmenu.MenuItems.Add("-"); 
     contextmenu.MenuItems.Add(OpenGUI); 
     contextmenu.MenuItems.Add(Advancedmodewindow); 
     contextmenu.MenuItems.Add("-"); 
     contextmenu.MenuItems.Add(quitappitem); 
     icontask.ContextMenu = contextmenu; 

     icontask.Icon = iconone_active; 
     icontask.Visible = true; 
    } 

    private void Advancedmodewindow_click(object sender, EventArgs e) 
    { 
     classx.AllocConsole(); 
     Console.WriteLine("X"); 
     classx.FreeConsole(); 
    } 

    private void OpenGUI_click(object sender, EventArgs e) 
    { 
     this.ShowInTaskbar = true; 
     this.WindowState = FormWindowState.Normal; 
    } 

    private void quitappitem_click(object sender, EventArgs e) 
    { 
     Threadworkermy.Abort(); 
     icontask.Dispose(); 
     this.Close(); 
    } 

    public void checkActivityThread() 
    { 
     try 
     { 
      while(true) 
      { 
       Thread.Sleep(100); 
      } 
     } catch(ThreadAbortException tbe) 
     { 

     } 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     this.WindowState = FormWindowState.Minimized; 
     this.ShowInTaskbar = false; 
    } 


} 
} 

예외입니다. 유형을 바꾸라고하는 사람들에게는 할 수 없습니다.

(은 WFA 응용 프로그램이어야합니다) 왜

CONSOLE.WRITELINE 

과 유사한 코드가 작동합니까?

답변

1

콘솔 열기/닫기에서 예외가 발생하지 않습니다. 그것은 당신이 콘솔로 무엇인가를 쓰고 읽고 싶을 때오고 있습니다. RESET 콘솔에 대한 표준 IO가 있어야합니다. AllocConsole() 후에이 작업을 수행해야 할 때마다. 아래 코드를 확인하십시오. 테스트되었습니다.

CODE :

private void Advancedmodewindow_click(object sender, EventArgs e) 
{ 
    classx.AllocConsole(); 

    TextWriter writer = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = true }; 
    Console.SetOut(writer); 

    Console.WriteLine("X"); 

    Console.SetIn(new StreamReader(Console.OpenStandardInput())); 
    string line = Console.ReadLine(); 

    classx.FreeConsole(); 
} 
+0

내가 Console.ReadLine()를 입력하려고 할 때 때문에 다음 입력을 수행하는 방법; 그것은 동일한 예외를 던졌습니다 – dkman

+1

이 작품에 대한 쓰기, 다음 코드를 복제하고 StreamWerer 대신 StreamReader를 사용해야하는 경우 – Armin

+0

Thx는 PC에 다시 도착하자마자 코드에 넣습니다. – dkman

관련 문제