2012-07-31 8 views
5

Lo que tengo ahora: mi aplicación en C# es medio transparente, y no detecta eventos winapi - cada clic, arrastre, etc. es capturado por la ventana subyacente, que es una aplicación separada (como webbrower). Utilizo esto para superponer información sobre lo que muestra el navegador. Este es mi código para esto:forward winapi events a otra ventana

int exstyle = GetWindowLong(this.Handle, GWL_EXSTYLE); 
exstyle |= WS_EX_TRANSPARENT; 
SetWindowLong(this.Handle, GWL_EXSTYLE, exstyle); 

IntPtr hwndf = this.Handle; 
IntPtr hwndParent = GetDesktopWindow(); 
SetParent(hwndf, hwndParent); 

Pero ahora, me gustaría enviar a todos los eventos tanto mi ventana de la aplicación (que es semitransparente en la parte superior) y el navegador web (en mi aplicación). Entonces, por ejemplo, si hago clic, el clic funciona en ambas ventanas como si estuvieran en la parte superior. Me imagino que la única manera de hacerlo es detectar todos los eventos y luego reenviarlos a la ventana inferior, pero ¿hay alguna manera de hacerlo? Uso winforms como window lib.


Lo que hago ahora no es tan importante, porque normalmente quiero consumir eventos, y luego reenviarlos a la ventana subyacente. Entonces, esto es algo completamente diferente de lo que estoy haciendo ahora con WS_EX_TRANSPARENT. El objetivo de esto es arrastrar contenido en ambas ventanas simultáneamente. Si hay alguna forma mejor de hacerlo, me gustaría escucharlo.


Como mínimo lo que necesito es la transferencia de los eventos de arrastre a las dos ventanas, y todos los demás eventos de ventana subyacente (que no están bajo mi control). Entonces, tal vez será más fácil quedarse con mi ventana como WS_EX_TRANSPARENT (hace que los eventos pasen a través de la ventana subyacente) y simplemente instale el enlace global para recibir eventos de arrastre. ¿Qué piensas?

BTW no tengo experiencia con Winapi, por lo que la solución puede ser obvia.

+0

I don' Entiendo cómo no está recibiendo eventos ... ¿está creando una ventana real (debería)? O simplemente dibujando directamente en la pantalla (¡no debería!)? – tenfour

+0

@tenfour Configurando el estilo 'WS_EX_TRANSPARENT'. – Neil

+0

@tenfour sí, utilizo la ventana creada por .NET winform, y el dibujo es manejado por winform, por lo que es una ventana creada. Solo configuro un estilo WS_EX_TRANSPARENT y configuré la ventana padre como escritorio, lo que hace que el evento pase a la ventana subyacente, como aquí: http://www.codeproject.com/Articles/12877/Transparent-Click-Through-Forms y sí, hace que los mensajes no entren en la ventana, siempre y cuando la ventana sea directamente del escritorio. – Deadeye

Respuesta

0

Puede capturar los eventos de Windows envió su propia forma por la sobrecarga WndProc en el formulario, o bien llamando al user32!GetMessage

Puede enviar mensajes a otras formas de Windows a través de los user32!PostMessage o user32!SendMessage apis (read PostMessage function on msdn).

0

Puede intentar reenviar el evento después de que la forma subyacente lo haya manejado. Algo así como

protected override void OnDragOver(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    MyControl.ForwardDragEvent(drgevent); 
} 

En MyControl:

public void ForwardDragEvent(DragEventArgs drgevent) 
{ 
    base.OnDragOver(drgevent); 
    //Or call your own method to handle the event 
} 

he utilizado este reenviar scroll-eventos, en mi caso, sin embargo, sólo uno de los controles maneja el evento ..