是否可以在WPF窗口内嵌入控制台窗口?在WPF窗口内嵌入控制台窗口
作为一个小小的背景,起初我试图在WPF中从头开始实现一个控制台窗口,除了一个巨大的问题 - 它的速度非常慢之外,它是成功的。看到这里的问题是:
VT100 Terminal Emulation in Windows WPF or Silverlight
因为这似乎不是一种选择,我不是看在我的WPF应用程序,我已经学会了如何在此描述做托管的实际控制台窗口:
No output to console from a WPF application?
这是伟大的,由最好我想有一个控制台窗口看起来像它是WPF应用程序的其它部分的一部分。我知道使用WinForms应用程序是可能的,因为我已经看到它完成了,包括使用SetParent Win32 API。你可以看到一个例子.NET项目与嵌入一个控制台窗口进入壳体这个命令栏项目做的:
http://www.codeproject.com/KB/cs/commandbar.aspx
所以我希望它可以用WPF做的很好,但我没有想法你会怎么做。非常感谢帮助(另外,如果你有任何明智的解决方案来解决我在WPF中从零开始创建终端窗口的原始问题,因为这也解决了我的需求)。
UPDATE:
的帮助里德·科普塞的帮助下,我能得到嵌入在控制台窗口。然而,当然它需要被设计和移动,否则它看起来像一个WPF窗口内的常规控制台窗口。我需要标题栏和大型边框。做研究我想出了如何使用Win32 API来做这样的事情:
uint style = GetWindowLong(ConsoleManager.ConsoleWindowHandle, GWL_STYLE);
style &= ~(uint)WindowStyles.WS_CAPTION;
style &= ~(uint)WindowStyles.WS_THICKFRAME;
style &= ~(uint)WindowStyles.WS_DLGFRAME;
style &= ~(uint)WindowStyles.WS_POPUP;
SetWindowLong(ConsoleManager.ConsoleWindowHandle, GWL_STYLE, style);
MoveWindow(ConsoleManager.ConsoleWindowHandle, 0, 0, (int)WindowsFormsHost.ActualWidth, (int)WindowsFormsHost.ActualHeight, true);
但是有一个大问题。出于某种原因,控制台窗口有一个渲染工件。就好像它不是在左下角和右上角重新绘画一样。工件的宽度与标题栏和厚边框的宽度相似,事实上,如果我将工件大小的厚边框留下,则会出现问题。但重新绘制它不会有帮助,因为它重新出现。我可以,例如,移动窗口关闭屏幕并再次修复它,但它很快就重新出现在自己:
rendering artifact http://img837.imageshack.us/img837/6241/renderissue.png
更新2:即使我没有影响情况将它父进入WindowsFormsHost控件。我需要做的就是启动控制台(使用AllocConsole()),然后使用SetWindowLong删除它的标题栏。这是一台win7机器。
UPDATE 3:它似乎'搞乱'与这样的其他窗口不支持。控制台窗口计算其textarea假设有一个标题,所以没有办法解决这个问题。我认为我唯一的选择在WPF中获得类似控制台的行为将是编写一个自定义的WinForms控件,然后将其嵌入到WPF中。
你做到这一点成功? – 2012-06-24 03:24:01
@ShawnMclean Nope ...更新代表整个故事:( – InfinitiesLoop 2012-06-24 04:22:58
)您可能会看到Console2(后来分为ConsoleZ)程序,它们成功地在标签控件中托管了一系列命令提示符,但没有标题/标题 – 2016-06-14 08:16:35