Comment transmettre des événements de souris aux applications situées derrière la mienne en C # / Vista?

StackOverflow https://stackoverflow.com/questions/173579

Question

J'écris une application très spécialisée en C # qui flotte comme une fenêtre essentiellement transparente sur tout le bureau. Je veux pouvoir créer et transmettre des événements de souris aux applications situées derrière la mienne et les faire apparaître comme "normalement" en réponse à ces événements. Il serait également préférable que le gestionnaire de fenêtres puisse répondre.

Je ne suis pas un gourou de Windows et je ne sais pas comment y parvenir.

À partir de cette page: http://bytes.com/forum/thread270002.html

il semblerait que mouse_event serait bon, sauf que, comme mon application flotte sur tout le reste, je suppose que les événements générés ne parviendront jamais aux autres applications situées en dessous.

Il semble que la solution de rechange soit SendMessage, mais cela nécessite une bonne quantité de manipulation manuelle des fenêtres et les événements de souris générés ne sont pas "authentiques".

Avez-vous des idées sur la meilleure façon d’aborder cela?

Était-ce utile?

La solution 2

Après avoir examiné les points d'ancrage du système et d'autres solutions de bas niveau, j'ai trouvé une méthode beaucoup plus simple.

Tout d'abord, définissez TransparencyKey et BackColor du formulaire comme identiques. Cela ne m'a apporté aucune différence visuelle, mon formulaire était déjà transparent sur le plan visuel, mais cela facilitera le passage des événements de souris.

Deuxièmement, le code suivant laissera les événements de souris "tomber". via votre formulaire.

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

        return createParams;
    }
}

Enfin, définissez TopMost sur true.

Votre formulaire va désormais flotter au-dessus de tout, mais restera concentré sur toutes les autres applications.

Autres conseils

On dirait que vous voulez faire quelque chose comme filtrer les entrées de l'utilisateur.

Peut-être avez-vous simplement besoin d'un crochet clavier / souris.

Vous voudrez peut-être jeter un coup d'œil à l'appel d'API Windows SetWindowsHookEx.

Il devrait également y avoir suffisamment d’échantillons sur la manière de le faire en C #, la première chose que j’ai trouvée était ce lien (peut-être pas le meilleur article mais devrait vous en donner l’idée).

Si vous désactivez le contrôle et revenez, vous pouvez transmettre l'événement MouseDown au parent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top