2010-01-05 7 views
2

Je cherche à créer un hook de souris global fonctionnant sous XP/Vista/7 qui me permettrait d'accéder aux valeurs X, Y saisies par la souris, et de modifier ces valeurs avant ils ont frappé de Windows ...Crochet de souris global + simulation des entrées de la souris

Je veux aussi être en mesure de simuler les entrées de la souris entre les deux entrées de souris réelles ...

Par exemple, permet de dire que nos entrées ressemblaient à ceci:

1: 1 0 2: 2,0 3: 3,0 4:?,? Je veux être capable d'intercepter l'entrée numéro 4 et de la faire passer par une instruction 'if': Si la valeur de l'entrée correspond à certains paramètres, je veux modifier la valeur en ajoutant ou en soustrayant ...

une souris USB a un taux de vote par défaut de 125Hz et un maximum de 1000Hz ...

Si possible (en particulier lorsque le taux de vote est situé à moins de 1000Hz) Je voudrais entrées « injecter » « entre » mises à jour réelles de la souris (critique) ainsi par exemple:

(en millisecondes)

0008 - 1,0 0016 - 1,0 0032 - 2,0

Ainsi, la souris est mise à jour à 125Hz ... Puis-je détecter la fréquence des entrées et envoyer une entrée toutes les autres entrées? ?? Ainsi, par exemple, je pourrais doubler la fréquence de la souris de 125hz à 250hz et simuler mes propres mises à jour en fonction des règles que je définirais ...

Est-ce que l'une d'entre elles semble raisonnable? En ce moment je travaille en C# et je travaillais avec le "Gma.UserActivityMonitor" de ce tutoriel ici: http://www.codeproject.com/KB/cs/globalhook.aspx mais pour une raison quelconque, je reçois un coup de performance qui rend l'utilisation de ce code avec des jeux plein écran ont un retard inutilisable sur les entrées de la souris en raison au crochet ...

Peut-être que j'ai besoin d'écrire quelque chose en C++? Toute aide serait grandement appréciée. Merci!

+0

Cela semble douteux. Pourquoi avez-vous besoin de le faire? – Skilldrick

+0

Je veux créer une interface de souris qui recouvre Windows avec un système de menu 3D, et je dois pouvoir tourner, zoomer, faire un panoramique, etc. tout en maintenant l'entrée de la souris, donc je dois pouvoir accrocher la souris à un niveau bas et le modifier/moduler. – Drax

Répondre

1

Espérons que this link on grabbing raw mouse input sera utile, il comprend une bibliothèque écrite pour C# ainsi qu'une version C++. Il est destiné à permettre l'utilisation de plusieurs souris dans Windows, mais espérons que vous pouvez émuler ce qu'il utilise pour ce que vous voulez accomplir.

1

J'ai construit une bibliothèque qui peut vous aider avec cela, c'est une bibliothèque c simple et can work on games where common windows api would not.

L'exemple suivant montre comment inverser les mouvements de la souris avec cette bibliothèque, il multiplie fondamentalement juste déplacements à l'axe vertical par -1 afin qu'ils se produisent en sens contraire:

#include <interception.h> 
#include "utils.h" // for process priority control 

enum ScanCode 
{ 
    SCANCODE_ESC = 0x01 
}; 

int main() 
{ 
    InterceptionContext context; 
    InterceptionDevice device; 
    InterceptionStroke stroke; 

    raise_process_priority(); 

    context = interception_create_context(); 

    interception_set_filter(context, interception_is_keyboard, INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP); 
    interception_set_filter(context, interception_is_mouse, INTERCEPTION_FILTER_MOUSE_MOVE); 

    while(interception_receive(context, device = interception_wait(context), &stroke, 1) > 0) 
    { 
     if(interception_is_mouse(device)) 
     { 
      InterceptionMouseStroke &mstroke = *(InterceptionMouseStroke *) &stroke; 

      if(!(mstroke.flags & INTERCEPTION_MOUSE_MOVE_ABSOLUTE)) mstroke.y *= -1; 

      interception_send(context, device, &stroke, 1); 
     } 

     if(interception_is_keyboard(device)) 
     { 
      InterceptionKeyStroke &kstroke = *(InterceptionKeyStroke *) &stroke; 

      interception_send(context, device, &stroke, 1); 

      if(kstroke.code == SCANCODE_ESC) break; 
     } 
    } 

    interception_destroy_context(context); 

    return 0; 
}  

Vous pouvez voir qu'il ya un chèque du drapeau INTERCEPTION_MOUSE_MOVE_ABSOLUTE avant d'inverser les déplacements verticaux. Normalement, le système d'exploitation fonctionne avec des coordonnées relatives, mais j'ai constaté qu'à l'intérieur des machines virtuelles, les coordonnées de la souris fonctionnent sous une forme absolue, et non relative. Pour simplifier, cet échantillon n'inverse que les déplacements relatifs.

Vous pouvez vérifier plus de documentation au http://oblita.com/Interception.

+0

Merci. Je vais certainement regarder dans votre bibliothèque. –

Questions connexes