transmettre les événements winapi dans une autre fenêtre

Ce que j’ai maintenant: mon application en C # est à moitié transparente, et n’attrape pas les événements winapi – chaque clic, glisser, etc. Je l’utilise pour superposer des informations sur ce que montre le navigateur. Ceci est mon code pour ceci:

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); 

Mais maintenant, je voudrais envoyer tous les événements à la fois à la fenêtre de mon application (qui est à moitié transparente sur le dessus) et au navigateur Web (sous mon application). Ainsi, par exemple, si je clique, le clic fonctionne dans les deux fenêtres comme s’il se trouvait en haut. J’imagine que la seule façon de faire est d’attraper tous les événements et de les transférer ensuite dans la fenêtre inférieure, mais y a-t-il un moyen de le faire? J’utilise les winforms comme fenêtre de la fenêtre.


Ce que je fais maintenant n’est pas si important, car je veux normalement consumr des événements, puis les transférer dans une fenêtre sous-jacente. Donc, c’est quelque chose de complètement différent de ce que je fais maintenant avec WS_EX_TRANSPARENT. Le but est de faire glisser le contenu dans les deux fenêtres simultanément. S’il y a une meilleure façon de le faire, je serais heureux de l’entendre.


Le moins que je besoin est de transférer des événements de glisser sur les deux fenêtres, et tous les autres événements à la fenêtre sous-jacente (pas sous mon contrôle). Ainsi, peut-être sera-t-il plus facile de conserver ma fenêtre sous le nom de WS_EX_TRANSPARENT (fait passer les événements à une fenêtre sous-jacente) et installe simplement le hook global pour recevoir des événements de glissement? Qu’est-ce que tu penses?

BTW je n’ai pas d’expérience avec Winapi, donc la solution pourrait être évidente.

Vous pouvez capturer des événements Windows ayant envoyé votre propre formulaire en surchargeant WndProc sur le formulaire ou en appelant user32!GetMessage

Vous pouvez envoyer des messages à d’autres formulaires Windows via user32!PostMessage ou user32!SendMessage apis ( lisez la fonction PostMessage sur msdn ).

Vous pouvez essayer de transférer l’événement après que le formulaire sous-jacent l’ait traité. Quelque chose comme

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

Dans MyControl:

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

Je l’ai utilisé pour transférer des événements de défilement, dans mon cas cependant, un seul des contrôles a traité l’événement.