遗憾迟香 发表于 2020-10-22 18:44

winform将控制台作为mdi子窗体

winform中可以这样调用控制台
static extern bool FreeConsole();
public static extern bool AllocConsole();
请问如何实现将控制台窗体作为主窗体的子窗体?

xie83544109 发表于 2020-10-22 19:21

:lol
如果是易语言的话就是"窗口置父"
应该是对应的一句API

遗憾迟香 发表于 2020-10-22 20:29

xie83544109 发表于 2020-10-22 19:21
如果是易语言的话就是"窗口置父"
应该是对应的一句API

我不懂,感觉易语言抄的C++

c03xp 发表于 2020-10-23 09:00

只有C++的//只要将下面的函数加到初始化的地方之后,就可以使用printf输出数据到console了,当然也可以使用cout输出。
//另:关闭控制台程序:FreeConsole();
void InitConsole()
{

        //try to create a new console       
        bool isOk = AllocConsole() != FALSE;
        if (isOk)
        {
                HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
                //make the std_output in text mode
                int fd = _open_osfhandle((long)hStdOut, _O_TEXT);
                if (fd > 0)
                {
                        //open in write modle
                        gfile = _fdopen(fd, "w");
                        //disable buffer
                        setvbuf(gfile, NULL, _IONBF, 0);
                }
                else {
                        AfxMessageBox("fd is wrong!");
                }

        }
        else
        {
                AfxMessageBox("call failed console. \r\n");
        }



}

欧雨鹏 发表于 2020-10-23 22:54

其实你需要的不是控制台。而是控制台那样的处理过程和结果。所以,你需要的不是一个系统原生console。而是需要一个类似的功能。
你需要的是一个Process类。如这样:
process.StartInfo.FileName="cmd.exe"
StartInfo.CreateNoWindow=true;
process.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
process.StartInfo.RedirectStandardOutput = true;//输出信息
process.StartInfo.RedirectStandardError = true;//输出错误
process.start();
OK,然后你就可以写个thread,在线程进行调度,用CountdownEvent来设置线程数。
至于界面,你可以拉一个列表啥的之类的,编辑框啥的,然后自己设计一下。输入输出。背景设置为全黑。
基本上就达到你想要的效果了。

欧雨鹏 发表于 2020-10-23 22:59

少写了一个process.StandardInput.WriteLine("ping 192.168.0.1 -t");

欧雨鹏 发表于 2020-10-25 02:22

今天找到了另一个方法。不知道是不是你想要的。
代码如下:
      
      private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
     
      public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
      private void button1_Click(object sender, EventArgs e)
      {
         
             Process p = new Process();
      p.StartInfo.FileName = "cmd.exe ";
      p.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Minimized;//加上这句效果更好
      p.Start();
      System.Threading.Thread.Sleep(500);//加上,100如果效果没有就继续加大
  
      SetParent(p.MainWindowHandle, this.panel1.Handle);
      
      ShowWindow(p.MainWindowHandle, 3);
      

      }
我写的时候需要点击button才会添加cmd到panel控件中。主要是在这句代码, System.Threading.Thread.Sleep(500);//如果sleep里的数值太低,可能㠌入不进panel控件中。因此我把它设置为500,如果500没效果,可以设置更大。
显示效果如下:
页: [1]
查看完整版本: winform将控制台作为mdi子窗体