Можно ли встроить консольное окно в окно 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, так как это также решило бы мои потребности).
ОБНОВЛЕНИЕ:
С помощью Рида Копси мне удалось встроить консольное окно.Однако, конечно, его нужно было стилизовать и перемещать, иначе он просто выглядел как обычное консольное окно внутри окна 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);
Однако есть одна большая проблема.По некоторым причинам в окне консоли есть артефакт рендеринга.Это как если бы оно не перекрашивалось в нижнюю левую и верхнюю правую стороны.Ширина артефакта аналогична ширине строки заголовка и толстой границы, и на самом деле, если я оставлю толстую границу, размер артефакта уменьшится.Но просто перекрасить это не поможет, так как он появляется снова.Я могу, например, переместить окно за пределы экрана и обратно, чтобы исправить его, но вскоре оно снова появляется само по себе:
артефакт рендеринга http://img837.imageshack.us/img837/6241/renderissue.png
ОБНОВЛЕНИЕ 2: Эффект происходит, даже если я не добавляю его в элемент управления WindowsFormsHost.Все, что мне нужно сделать, чтобы воспроизвести его, это запустить консоль (используя AllocConsole ()), а затем удалить ее строку заголовка с помощью SetWindowLong.Это машина win7.
ОБНОВЛЕНИЕ 3: Кажется, что "возиться" с другими окнами, как это не поддерживается.Окно консоли вычисляет свою текстовую область, предполагая, что есть заголовок, поэтому нет никакого способа обойти это.Я думаю, что мой единственный вариант получить консольное поведение в WPF - написать собственный элемент управления WinForms, а затем внедрить его в WPF.