2010-07-29 14 views
1

J'ai la situation suivante: J'ai un programme spécial en 3D que je dois pouvoir faire réagir aux événements multi-touch sans changer le programme lui-même. Par conséquent j'ai besoin d'un programme de mappeur, qui reçoit les événements multi-touch de Windows 7, les convertit dans les événements de souris et de clavier correspondants et envoie ces événements émulés au programme 3D, afin qu'il puisse traiter ces événements.Est-il possible d'intercepter des événements multitouch Win7, de les convertir en événements souris et clavier et de les envoyer à une autre application?

Je l'ai déjà lu et essayé beaucoup et mon approche actuelle est d'avoir une fenêtre de recouvrement presque transparent sur le programm 3D pour attraper des événements multi-touch. Mais c'est aussi le problème, je n'arrive pas à transférer les événements souris générés au programme 3D sous-jacent d'une manière utilisable. À l'heure actuelle, j'ai utilisé des fonctions pinvoke comme mouse_event, SendMessage et ainsi de suite, mais aucun d'eux n'a fonctionné pour moi. Comme je devais toujours mettre le programme 3D en avant, envoyer l'événement et après, j'avais besoin de mettre mon programme de mappeur en avant. Cela fonctionne assez merdique.

Donc, ma question est plus ou moins, est-il une approche de travail agréable de faire les choses que je l'ai mentionné ci-dessus? Ou au moins une bonne façon d'envoyer des événements de souris et de clavier aux processus en arrière-plan?

quelqu'un pourrait me donner l'espoir d'un soupçon ou une suggestion ....

Voici la façon dont je simuler les clics de souris en ce moment:

private void OnMouseDown(object sender, MouseEventArgs e) 
    {  
     Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y)); 

     //Simulate the mouse event on the given position 
     this.Visible = false; 

     Cursor.Position = position; 
     mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); 
    } 

    private void OnMouseUp(object sender, MouseEventArgs e) 
    { 
     Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y)); 

     //Simulate the mouse event on the given position 
     Cursor.Position = e.Location; 
     mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTUP), 0, 0, 0, 0); 

     this.Visible = true; 
    } 

    //Get a handle to the mouse event manager 
    [DllImport("user32.dll")] 
    private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo); 

Répondre

0

Il n'y a pas une façon de diriger les événements souris/clavier à un processus particulier dans Win32. Cela étant dit, cependant, vous pourriez être en mesure d'obtenir que cette approche fonctionne:

  1. Enregistrez votre fenêtre Mapper une fenêtre tactile pour obtenir des événements tactiles.
  2. Ajouter un gestionnaire pour WM_NCHITTEST dans votre boucle de message, appelez DefWindowProc() pour obtenir le gestionnaire par défaut, puis convertir les retours de HTCLIENT à HTTRANSPARENT. Cela amènera Windows à transmettre tous les événements de souris à travers votre fenêtre, sur la fenêtre sous-jacente.
  3. Ce ne fonctionnera probablement pas si la fenêtre de votre mappeur vit dans un processus distinct de votre programme client; Si c'est le cas, vous devrez faire du piratage avec AttachThreadInput. Incidemment, je ne le recommande pas car les files d'attente de threads fusionnées sont très sensibles aux bogues.