winform将控制台作为mdi子窗体
winform中可以这样调用控制台static extern bool FreeConsole();
public static extern bool AllocConsole();
请问如何实现将控制台窗体作为主窗体的子窗体?
:lol
如果是易语言的话就是"窗口置父"
应该是对应的一句API
xie83544109 发表于 2020-10-22 19:21
如果是易语言的话就是"窗口置父"
应该是对应的一句API
我不懂,感觉易语言抄的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");
}
} 其实你需要的不是控制台。而是控制台那样的处理过程和结果。所以,你需要的不是一个系统原生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来设置线程数。
至于界面,你可以拉一个列表啥的之类的,编辑框啥的,然后自己设计一下。输入输出。背景设置为全黑。
基本上就达到你想要的效果了。 少写了一个process.StandardInput.WriteLine("ping 192.168.0.1 -t"); 今天找到了另一个方法。不知道是不是你想要的。
代码如下:
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]