valor redireccionar proyecto otro obtener llamar formulario form desde cerrar acceder abrir c# winforms pinvoke

redireccionar - Adjuntar ventana de formulario a otra ventana en C#



obtener un valor de otro formulario c# (2)

Quiero adjuntar un formulario a otra ventana (de otro proceso). Intento hacer esto usando

[DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); setParentWindow(myWindowHwnd, newParentHwnd);

Al hacerlo, mi forma se adjunta, pero también es invisible . La pregunta "Adjuntar ventana ..." resuelve este problema para una ventana WPF, básicamente mediante el uso de

HwndSourceParameters parameters = new HwndSourceParameters(); ... HwndSource src = new HwndSource(parameters);

He intentado transferir esto a mi formulario, pero no puedo hacerlo (p. Ej., Cómo manejar src.RootVisual = (Visual)window.Content; -> Complete source ).

Otro comentario dice, necesito modificar el estilo de las ventanas:

Por razones de compatibilidad, SetParent no modifica los estilos de ventana WS_CHILD o WS_POPUP de la ventana cuyo elemento primario se está cambiando. Por lo tanto, si hWndNewParent es NULL, también debe borrar el bit WS_CHILD y configurar el estilo WS_POPUP después de llamar a SetParent. A la inversa, si hWndNewParent no es NULL y la ventana era anteriormente un elemento secundario del escritorio, debe borrar el estilo WS_POPUP y establecer el estilo WS_CHILD antes de llamar a SetParent.

Aquí falto la API correspondiente para hacerlo, ¿puedo hacerlo directamente desde C # o tengo que usar otra DllImport nuevo?

Bien o malvado: SetParent () win32 API advierte entre diferentes procesos para evitar adjuntar ventanas en diferentes procesos, pero al menos quiero intentarlo.

Pregunta:

¿Qué tendría que hacer para que la ventana de formulario sea visible? Si el enfoque con WS_Child es el correcto, ¿cómo lo configuraría? ¿O es el enfoque de WPF el camino a seguir, pero cómo lo aplicaría a un formulario de Windows?

- Hallazgos (agregados más tarde) -

Modificar el estilo de Windows de otra aplicación usando winAPI muestra cómo modificar el estilo desde C # / PInvoke

Encuentre todos los estilos de ventanas aquí, sintaxis de C # en la parte inferior.

- Hallazgos debido a la discusión con Alan -

Ejecuté mi programa en Win XP para realizar una verificación cruzada (vea la respuesta de Alan a continuación y los comentarios). Al menos ahora veo algo. Desde que agregué las coordenadas de los ejemplos de Alan, mi ventana ahora brilla en el bloc de notas cuando se mueve sobre la otra ventana cerca de la esquina superior izquierda. Todavía puede ver el texto escrito en el bloc de notas como superposición. Bajo Win 7 (32) no veo nada en absoluto.

  1. Ahora necesito saber si esto se puede escribir de manera estable, apareciendo también en Win 7.
  2. Sin embargo, todavía no puedo hacer clic en ningún botón de mi formulario, también debe resolverse.

@Horst Walter Oye, no estoy seguro de que hayas solucionado el problema, pero acabo de encontrar una solución a esto ...

Para mí, el problema fue la transparencia del formulario principal que desea dentro del otro formulario.

Simplemente desactiva la transparencia y debería funcionar.


Aquí hay un ejemplo de trabajo. La aplicación de alojamiento es una aplicación simple de WinForms con un formulario en blanco (no se incluye aquí), mientras que la "aplicación de invitado" tiene un formulario principal (código detrás incluido abajo) con algunos controles, incluido un botón de prueba para mostrar un mensaje después de cambiar el invitado padre de la forma

Las advertencias habituales vinculadas a la pregunta del OP también se aplican a esto.

public partial class GuestForm: Form { [DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll")] public static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll", SetLastError = true)] private static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); public static int GWL_STYLE = -16; public static int WS_CHILD = 0x40000000; public GuestForm() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("done"); } private void button2_Click(object sender, EventArgs e) { Process hostProcess = Process.GetProcessesByName("HostFormApp").FirstOrDefault(); if (hostProcess != null) { Hide(); FormBorderStyle = FormBorderStyle.None; SetBounds(0, 0, 0, 0, BoundsSpecified.Location); IntPtr hostHandle = hostProcess.MainWindowHandle; IntPtr guestHandle = this.Handle; SetWindowLong(guestHandle, GWL_STYLE, GetWindowLong(guestHandle, GWL_STYLE) | WS_CHILD); SetParent(guestHandle, hostHandle); Show(); } } }