En una aplicación WPF (o WinForms) hay dos 'objetos' (es decir bloques de memoria que contiene información) a una 'ventana':
- El sistema de ventana de objeto.
- Los objetos gestionados que 'envuelven' el objeto del sistema.
El acceso al objeto ventana del sistema se proporciona a través del controlador de la ventana (tipo de HWND en código no administrado, IntPtr en código administrado). Dado un identificador de ventana, que ya ha obtenido, puede manipular esa ventana con el Window API methods. Puede usar p/invoke para esto.
El acceso al objeto gestionado, que reside en el montón del proceso (o AppDomain en el caso de un proceso gestionado) está prohibido. Esta memoria está 'protegida' de otros procesos (1).
La única forma en que los objetos se pueden compartir entre los procesos (o AppDomains) es a través de la ordenación, que es un esfuerzo cooperativo por parte de ambos procesos. Esto se aplica incluso a muchos de los métodos API de Win32 cuando se accede a una ventana en otro proceso. No todo el acceso es posible sin una clasificación personalizada.
Tenga en cuenta que, a diferencia de WinForms, WPF no usa (normalmente) las ventanas del sistema para los controles. Si su objetivo es manipular el árbol visual en otro proceso/dominio de WPF, simplemente no tiene suerte a menos que ese proceso proporcione algún tipo de interfaz de Automatización.
(1) Si bien es posible leer la memoria bruta de otro proceso, los objetos en un montón administrado son objetivos en movimiento. Uno nunca podría encontrarlos, incluso si de alguna manera pudiera suspender el hilo de recolección de basura de ese proceso.
¿Quiere decir Window Handle? (sin la 'r') ¿Estás buscando el objeto .NET real? –
Me refiero a la manija de la ventana. – Jawahar
No puede obtener System.Windows.Window desde un HWND en otro proceso. Aunque, ¿qué estás tratando de hacer? Puede haber algunas maneras de hacer lo que intenta hacer al final. –