Встройте Консоль в Окне WPF

Действительно ли возможно встроить консоль в окне WPF?

Так же мало фона, сначала, я пытался реализовать консоль с нуля в WPF, который был успешен за исключением одной огромной проблемы - это чрезвычайно медленно. Посмотрите вопрос здесь:
Эмуляция терминала VT100 в Windows WPF или Silverlight

Так как это, кажется, не опция, я вместо этого смотрю на хостинг фактической консоли в моем приложении WPF, которое я изучил, как сделать, как описано здесь:

Никакой вывод к консоли из приложения WPF?

И это является большим, но идеально, я хотел бы иметь ту консоль, похожи на него, часть остальной части приложения WPF. Я знаю, что это возможно с приложением WinForms, поскольку я видел сделанное, включающее использование SetParent Win32 API. Вы видите пример проект.NET, который делает это с этим проектом CommandBar, который встраивает консоль в оболочку:

http://www.codeproject.com/KB/cs/commandbar.aspx

Таким образом, я надеюсь, что это может быть сделано с WPF также, но я понятия не имею, как Вы сделали бы это. Справка очень ценится (также, если бы у Вас есть какие-либо блестящие решения моей исходной проблемы создания окна терминала с нуля в WPF, так как это решило бы мои потребности также).

ОБНОВЛЕНИЕ:

Со справкой Reed Copsey справки я смог встроить Консоль. Однако, конечно, это должно было быть разработано и перемещено, или иначе это просто было похоже на регулярную консоль в окне WPF. Мне нужны строка заголовка и большие удаленные границы. При проведении исследованиях я выяснил, как использовать API Win32, чтобы сделать это как это:

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

Однако существует одна большая проблема. По некоторым причинам консоль имеет артефакт рендеринга. Это - как будто это не перекрашивает себя на нижних левых и верхних правых сторонах. Ширина артефакта подобна ширине строки заголовка и толстой рамки, и на самом деле, если я уезжаю, толстая рамка в размере артефакта понижается. Но просто перекрашивание это не поможет, так как это вновь появляется. Я могу, например, переместить окно от экрана и назад снова зафиксировать его, но это скоро вновь появляется самостоятельно:

рендеринг артефакта http://img837.imageshack.us/img837/6241/renderissue.png

ОБНОВЛЕНИЕ 2: эффект происходит, даже если я не порождаю его в управление WindowsFormsHost. Все, что я должен сделать для репродуцирования его, является запуском консоль (использующий AllocConsole ()), и затем удалите его строку заголовка с SetWindowLong. Это - win7 машина.

ОБНОВЛЕНИЕ 3: кажется, что 'питание' с другими окнами как это не поддерживается. Консоль вычисляет свою текстовую область, предполагающую, что существует подпись, таким образом, нет никакого пути вокруг этого. Я думаю, что моя единственная опция получить подобное консоли поведение в WPF будет, чтобы записать, что пользовательский WinForms управляет и затем встраивает это в WPF.

12
задан Metomorphose 29 November 2018 в 03:58
поделиться

1 ответ

Вы должны быть в состоянии использовать ту же технику, что и в приложении Windows Forms, которое вы показали, путем перенаправления в HwndHost. Вы даже можете просто адаптировать код Windows Forms и поместить это непосредственно в элемент управления WindowsFormsHost.

7
ответ дан 2 December 2019 в 20:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: