Pregunta

Estoy escribiendo una aplicación muy especializada en C # que flota como una ventana mayoritariamente transparente en todo el escritorio. Quiero poder crear y pasar eventos del mouse a aplicaciones detrás de la mía, y hacer que parezcan que operen "normalmente", respondiendo a esos eventos. También sería preferible que el administrador de ventanas respondiera.

No soy un gurú de Windows, y no estoy seguro de cómo lograrlo mejor.

Desde esta página: http://bytes.com/forum/thread270002.html

parece que mouse_event sería bueno, excepto que como mi aplicación está flotando sobre todo lo demás, supongo que mis eventos generados nunca llegarán a las otras aplicaciones que se encuentran debajo.

Parece que la alternativa es SendMessage, pero eso requiere una buena cantidad de manipulación manual de las ventanas, y los eventos del mouse generados no son "auténticos".

¿Alguna idea sobre la mejor manera de abordar esto?

¿Fue útil?

Solución 2

Después de ver los ganchos del sistema y otras soluciones de bajo nivel, encontré un método mucho más simple.

Primero, establezca la TransparencyKey y el BackColor del formulario para que sean iguales. Esto no supuso ninguna diferencia visual para mí, ya que mi forma era visualmente transparente, pero esto ayudará a dejar pasar los eventos del mouse.

En segundo lugar, el siguiente código permitirá que los eventos del mouse " caigan " a través de su formulario.

protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
    }
}

Por último, establece que TopMost sea verdadero.

Tu formulario ahora flotará sobre todo visualmente, pero dejará de centrarse en todas las demás aplicaciones.

Otros consejos

Parece que quieres hacer algo como filtrar las entradas de los usuarios.

Tal vez solo necesite un gancho para teclado / mouse.

Es posible que desee echar un vistazo a la API de Windows llamada SetWindowsHookEx.

También debería haber suficientes ejemplos de cómo hacer eso en C # disponible, lo primero que encontré fue este enlace (quizás no sea el mejor artículo pero debería darle una idea).

Si deshabilitas el control y regresas, puedes pasar el evento MouseDown a los padres.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top