2010-04-09 16 views
6

No estoy seguro si esto es posible, pero ¿hay alguna manera de abrir otro programa como el bloc de notas dentro del contenedor de una ventana de WPF? similar a la de poder abrir una página web con el control del navegador web?WPF abriendo el programa exe dentro de la ventana de WPF

Básicamente me gustaría abrir el bloc de notas u otro exe pero mantenerlo restringido dentro del contenedor de la ventana WPF usando el código xaml/C#? no estoy seguro si es posible?

Respuesta

1

lograron hacer esto utilizando el método SetParent

[DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SetParent(IntPtr hwc, IntPtr hwp); 

así consiguiendo el manillar para una ventana de WPF y luego la ventana exe, yo era capaz de configurar la ventana de WPF como padre por lo que dio una simulación de estar incrustado (también cerrado la barra de título, etc)

obtuvo ayuda de aquí: http://channel9.msdn.com/forums/TechOff/250417-Hide-window-caption-in-c/

+0

Me alegro de que funcionó para usted. Tiene dos limitaciones que debe tener en cuenta: 1. La barra de título, el botón Cerrar, etc., no se muestran para que no se vea como una ventana, y 2. Causa fallas de aplicaciones en aplicaciones que dependen de eventos NC_, esa pintura en el área no clientela, o que escanea su árbol de ventanas para encontrar la ventana raíz. La otra técnica es menos invasiva y más universal y también proporciona la capacidad de ocultar el área no cliente si así lo desea. –

-1

No puede hacer eso.

El motivo por el que puede ver una página web es porque IE se diseñó utilizando una arquitectura que lo permite; el motor de representación no es realmente parte del ejecutable IE, sino una DLL que expone un componente.

Los EXEs genéricos no funcionan de esa manera, y no puede incrustarlos dentro de su aplicación.

+1

Pero ** ** puede hacer eso. Ver mi respuesta –

6

Sí es posible.

Todo lo que tiene que hacer es:

  1. Crear una WindowsFormsHost y agregarlo a un panel de la interfaz de usuario
  2. inicio del proceso (como Bloc de notas) usando Process.Start proceso de llamada
  3. . WaitForInputIdle
  4. uso process.MainWindowHandle para obtener la ventana de manejar
  5. SetWindowPos de llamada para establecer la ventana del proceso para las coordenadas y Z Orden de la ventana HwndHost
  6. Hook tanto el HwndHost y la process.MainWindowHandle para detectar cambios en el tamaño y repita el paso 5.

Es bastante sencillo de hacer todo esto. El efecto es que toda la ventana del Bloc de notas (o cualquier aplicación que haya iniciado) aparece y se comporta exactamente como si fuera parte de su aplicación WPF.

+0

WaitForInputIdle espera a que cualquier hilo quede inactivo, no solo el hilo de la GUI. –

+0

@Sheng: Buen punto. Lo anterior funciona para una aplicación simple como el Bloc de notas, pero para una aplicación más compleja puede ser necesario reemplazar el paso 4 con código que usa periódicamente EnumWindows para buscar una ventana con un valor coincidente devuelto por GetWindowThreadProcessId que es visible y no tiene elemento primario. En cualquier caso, aún es posible usar XAML/C#. –