2017-03-05 50 views
0

我有一个程序WFA,它也有命令窗口。我用AllocConsole()打开窗口;当我关闭控制台窗口时,我使用FreeConsole();但是当我用AllocConsole()再次打开它时;我想从中读写,它会抛出一个例外。在C#中使用控制台窗口时出现异常(Windows窗体应用程序)

的代码:

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; 
    } 


} 

}

例外,它抛出 'System.IO.IOException' 在mscorlib.dll 其他信息:句柄无效。

对于那些会说改变类型的人,我不能。 (它需要是WFA应用程序)

+2

它看起来并不像完整的代码,你怎么分配安慰?提供'classx.AllocConsole()'背后的代码请 – bc004346

+0

我编辑了代码,这是程序 – Bigpodgurc

回答

0

这似乎是一个摧毁consolewindow的问题,所以你可以隐藏它。

隐藏的窗口,你需要从user32.dll额外的DllImport和改变GetConsoleWindow的返回值来IntPtr的:

[DllImport("user32.dll")] 
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

[DllImport("kernel32.dll")] 
public static extern IntPtr GetConsoleWindow(); 

现在检查控制台手柄已经存在。如果它确实显示控制台,否则创建consolewindow:

private void Advancedmodewindow_click(object sender, EventArgs e) 
{ 
    IntPtr handle = classx.GetConsoleWindow(); 
    if (handle == IntPtr.Zero) 
    { 
     classx.AllocConsole(); 
     handle = classx.GetConsoleWindow(); 
    } 
    else 
    { 
     //shows the window with the given handle 
     classx.ShowWindow(handle, 8); 
    } 
    Console.WriteLine("X"); 
    //hides the window with the given handle 
    classx.ShowWindow(handle, 0); 
} 

原来的解决方案可以在这里找到:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/cdee5d88-3325-47ce-9f6b-83aa4447f8ca/console-exception-on-windows-8?forum=clr

+0

的整个代码,可以工作,但我发现它的工作方式 – Bigpodgurc

相关问题