【问题标题】:Exception when using console window in C# (Windows form application)在 C# 中使用控制台窗口时出现异常(Windows 窗体应用程序)
【发布时间】:2017-07-24 23:50:03
【问题描述】:

我有一个程序 WFA,它也有命令窗口。我用 AllocConsole() 打开窗口;当我关闭控制台窗口时,我使用 FreeConsole();但是当我用 AllocConsole() 再次打开它时;我想从中写入和读取,它会引发异常。

代码:

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


}

}

在 mscorlib.dll 中抛出“System.IO.IOException”的异常 附加信息:句柄无效。

对于那些说要改变类型的人,我不能。 (需要是WFA申请)

【问题讨论】:

  • 代码看起来不完整,console怎么分配?请提供classx.AllocConsole()后面的代码
  • 我编辑了代码这是整个程序的代码

标签: c# console


【解决方案1】:

销毁控制台窗口似乎存在问题,因此您可以将其隐藏。

要隐藏窗口,您需要一个来自 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();

现在检查控制台句柄是否已经存在。如果确实显示控制台,则创建控制台窗口:

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

【讨论】:

  • 这可以工作,但我找到了一种工作方式
猜你喜欢
  • 1970-01-01
  • 2014-02-17
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多