Ну ... если бы вопрос был задан как 20 лет назад, можно было бы ответить «Конечно, посмотрите на« OLE »!», Вот ссылка на то, что такое «Связывание и внедрение объектов»:
http://en.wikipedia.org/wiki/Object_Linking_and_Embedding
Если вы прочитаете эту статью, вы увидите количество интерфейсов, определенных в этой спецификации, не потому, что ее автор считал это забавным, а потому, что технически трудно достичь вобщие случаи
На самом деле он все еще поддерживается некоторыми приложениями (в основном Microsoft, поскольку Microsoft был почти единственным спонсором OLE ...)
Вы можете встроить эти приложения, используя что-тоназывается DSOFramer (см. здесь ссылки на SO: MS KB311765 и DsoFramer отсутствуют на сайте MS ), компонент, который позволяет визуально размещать OLE-сервер (т. е. внешние приложения, выполняющиеся как другой процесс) внутри приложения.Это своего рода большой взлом, который Microsoft выпустила несколько лет назад, и который больше не поддерживается, так что двоичные файлы довольно сложно найти!
(возможно) все еще работает для простых серверов OLE, ноЯ думаю, что где-то читал, что это даже не работает для новых приложений Microsoft, таких как Word 2010. Таким образом, вы можете использовать DSOFramer для приложения, которое его поддерживает.Вы можете попробовать.
Для других приложений, ну, сегодня, в современном мире, в котором мы живем, вы не размещаете приложений , запущенных во внешнем процессе, вы размещаете компоненты , и, как правило, они должны запускаться в процессе .Вот почему вам будет очень трудно делать то, что вы хотите сделать в целом .Одной из проблем, с которой вы столкнетесь (и не в последнюю очередь в последних версиях Windows), является безопасность: как ваш процесс, которому я не доверяю, может законно обрабатывать моих окон и меню, созданных моимprocess :-)?
Тем не менее, вы можете делать довольно много приложений за приложениями, используя различные хакеры для Windows.SetParent является в основном матерью всех хаков: -)
Вот фрагмент кода, который расширяет пример, который вы указали, добавляя автоматическое изменение размера и удаление поля заголовка.Это демонстрирует, как неявно удалить блок управления, системное меню, например:
public partial class Window1 : Window
{
private System.Windows.Forms.Panel _panel;
private Process _process;
public Window1()
{
InitializeComponent();
_panel = new System.Windows.Forms.Panel();
windowsFormsHost1.Child = _panel;
}
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32")]
private static extern IntPtr SetParent(IntPtr hWnd, IntPtr hWndParent);
[DllImport("user32")]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
private const int SWP_NOZORDER = 0x0004;
private const int SWP_NOACTIVATE = 0x0010;
private const int GWL_STYLE = -16;
private const int WS_CAPTION = 0x00C00000;
private const int WS_THICKFRAME = 0x00040000;
private void button1_Click(object sender, RoutedEventArgs e)
{
button1.Visibility = Visibility.Hidden;
ProcessStartInfo psi = new ProcessStartInfo("notepad.exe");
_process = Process.Start(psi);
_process.WaitForInputIdle();
SetParent(_process.MainWindowHandle, _panel.Handle);
// remove control box
int style = GetWindowLong(_process.MainWindowHandle, GWL_STYLE);
style = style & ~WS_CAPTION & ~WS_THICKFRAME;
SetWindowLong(_process.MainWindowHandle, GWL_STYLE, style);
// resize embedded application & refresh
ResizeEmbeddedApp();
}
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
if (_process != null)
{
_process.Refresh();
_process.Close();
}
}
private void ResizeEmbeddedApp()
{
if (_process == null)
return;
SetWindowPos(_process.MainWindowHandle, IntPtr.Zero, 0, 0, (int)_panel.ClientSize.Width, (int)_panel.ClientSize.Height, SWP_NOZORDER | SWP_NOACTIVATE);
}
protected override Size MeasureOverride(Size availableSize)
{
Size size = base.MeasureOverride(availableSize);
ResizeEmbeddedApp();
return size;
}
}
Это в основном все "традиционные" хаки Windows.Вы также можете удалить меню элементов, которые вам не нравятся, как описано здесь: http://support.microsoft.com/kb/110393/en-us (Как удалить элементы меню из поля меню управления формы).
Вы также можете заменить «блокнот».exe "от" winword.exe "и кажется работать.Но есть ограничения (клавиатура, мышь, фокус и т. Д.).
Удачи!