吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1159|回复: 6
收起左侧

[求助] winform将控制台作为mdi子窗体

[复制链接]
遗憾迟香 发表于 2020-10-22 18:44
winform中可以这样调用控制台
[C#] 纯文本查看 复制代码
[DllImport("kernel32.dll")]static extern bool FreeConsole();
[DllImport("kernel32.dll")]public static extern bool AllocConsole();

请问如何实现将控制台窗体作为主窗体的子窗体?
QQ截图20201022184254.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

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

如果是易语言的话就是"窗口置父"
应该是对应的一句API
 楼主| 遗憾迟香 发表于 2020-10-22 20:29
xie83544109 发表于 2020-10-22 19:21
如果是易语言的话就是"窗口置父"
应该是对应的一句API

我不懂,感觉易语言抄的C++
c03xp 发表于 2020-10-23 09:00
只有C++的
[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
今天找到了另一个方法。不知道是不是你想要的。
代码如下:
[C#] 纯文本查看 复制代码
      [DllImport("User32.dll ", EntryPoint = "SetParent")]
        private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
        [DllImport("user32.dll ", EntryPoint = "ShowWindow")]
        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没效果,可以设置更大。
显示效果如下:
ssss5.png
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-30 00:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表