Mapping des coordonnées de la souris

Mapping des coordonnées de la souris - C++ - Programmation

Marsh Posté le 28-07-2004 à 16:28:17    

Depuis quelques temps maintenant, j'essaie d'écrire un code qui me permette de modifier le comportement de la souris. Je m'explique:
En fait j'utilise une tablette graphique de type Volito (le modèle pas cher de Wacom). Le principe de la tablette, c'est qu'il fait un mapping de la surface de dessin de la tablette sur le bureau Windows. En clair, le point en haut à gauche de la tablette correspond au coin supérieur gauche du bureau, et le coin en bas à droite correspond au coin inférieur droit du bureau de Windows. Ca va très bien dans des conditions normales, mais ça commence à poser problème du moment que l'on utilise 2 moniteurs parce que dans ce cas le mapping fait que chaque écran partage une moitié de la surface de la tablette. Comme la tablette est une A6, ça fait qu'au final il ne reste plus grand chose de place pour dessiner :( Il y a aussi un autre problème de déformation qui entre en jeu.
 
En fait, c'est clair que ce serait aux drivers de la tablette de faire le mapping correctement. Mais le fabricant ne souhaite pas ajouter cette option pour ce modèle de tablette prétextant que ça engendrerait des coûts de développement, de tests, de validation, etc. et que ça augmenterait au final le prix de la tablette. D'ailleurs, les autres modèles plus chers du même fabricant supportent l'option, donc ils disent en gros que si on veut l'option, il faut acheter l'autre tablette (gentils les gars, mais ce n'était pas marqué sur le carton que c'était pas fait pour le dual monitor). Bon, donc comme apparemment c'est impossible de leur faire changer d'avis, il ne me reste plus qu'à faire le boulot moi-même.
 
Voilà pour la petite histoire. Retour à notre problème:
Donc maintenant l'idée c'est d'intercepter la position de la souris et de transformer les coordonnées pour mapper dans la région que l'on veut. J'ai essayé de différentes manières avec les GetCursorPos/SetCursorPos ainsi qu'avec DirectInput, mais je n'arrive jamais à avoir un truc correct. En fait, lorsque j'utilise DirectInput, je me retrouve avec 2 curseurs clignotants à l'écran, ce qui est normal parce que windows reçoit les coordonnées directement de la souris + celles que je transforme après. Donc voilà ma question (ouf, enfin !): est-ce qu'il y a moyen d'empêcher windows de recevoir/mettre à jour la position de la souris ? Question subsidiaire: est-ce que quelqu'un a déjà été confronté à ce problème et a une solution ?
 
Merci à ceux qui auront eu le courage de me lire jusqu'au bout, ainsi qu'à ceux qui ont une idée de solution  :)

Reply

Marsh Posté le 28-07-2004 à 16:28:17   

Reply

Marsh Posté le 28-07-2004 à 16:32:41    

Bah, heu, je dirais tout modestement ( :D ) que je tombe bien :)
 
Je fais en ce moment un ptit soft qui capture .... le clavier. Toi, tu veux capturer la souris .... c'est quasiment pareil (dans windows du moins).
 
Windows te permet d'installer des "hooks" bas niveau (fonctions callback) qu'il va appeler lorsque se produisent certains evenemments (souris, clavier et autres...).
 
Regarde les fonctions win32 "SetLowLeveMouseHook", ou qqchose dans le genre.
Tu dois pouvoir ecrire un prog qui sera informé de tous les evenements souris.

Reply

Marsh Posté le 28-07-2004 à 16:38:35    

oliv5 a écrit :

Bah, heu, je dirais tout modestement ( :D ) que je tombe bien :)
 
Je fais en ce moment un ptit soft qui capture .... le clavier. Toi, tu veux capturer la souris .... c'est quasiment pareil (dans windows du moins).
 
Windows te permet d'installer des "hooks" bas niveau (fonctions callback) qu'il va appeler lorsque se produisent certains evenemments (souris, clavier et autres...).
 
Regarde les fonctions win32 "SetLowLeveMouseHook", ou qqchose dans le genre.
Tu dois pouvoir ecrire un prog qui sera informé de tous les evenements souris.


Merci d'être tombé  :D  
Bon en fait je n'ai pas de problème pour recevoir les infos de la souris puisque je peux le faire avec un GetCursorPos() ou avec un GetDeviceState() de DirectInput. Le problème c'est que quand je mets à jour la position du curseur, en fait il semblerait que Windows ait déjà également mis à jour cette position. Du coup la position la souris switch entre les 2 positions (la position normale et la position modifiée).
Je vais quand même voir en détail ces fonctions bas niveau. Merci bcp :)

Reply

Marsh Posté le 28-07-2004 à 17:01:14    

LOl, j'ai parlé un peu vite...
La prochaine fois, je ferais mieux de la fermer ...  :jap:  
 
Je sais qu'il y a une fonction pour empécher tous les evenements souris/clavier d'arriver aux applications (MSDN, rubrique keyboard functions par ex) ... mais ca n'empechera certainement pas windows de déplacer le curseur à l'écran ...
 
Aprés t'avoir donné une lueur d'espoir, je vais te détruire le moral  :D  
Je pense que ca va etre trés compliqué, voire impossible : quand windows freeze (ca arrive), la dernière chose qui se bloque, c'est bien la souris ... Ce qui veut dire que c'est géré trés trés bas ...
 
Mais bon, on sait jamais, ya ptetre une fonction pour ca ...

Reply

Marsh Posté le 28-07-2004 à 18:14:10    

Moi je vois pas comment y arriver sans passer par un driver... Ou alors en modifiant le soft de ta tablette lui même (déssasembler / patcher le driver [:huit])


Message édité par HelloWorld le 28-07-2004 à 18:14:45

---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 28-07-2004 à 19:08:31    

Bon, en fouillant un peu dans des forums (héhé, à ce propos, je remarque que c'est un peu la guère entre Wacom et les utilisateurs du mode dual monitor [voir ici: http://www.wacom-europe.com/forum/ [...] PIC_ID=665  :D ) j'ai trouvé un utilitaire en VisualBasic (pour ceux que ça intéresse: http://sourceforge.net/projects/vbtablet/) qui capte les coordonnées de la tablette. Je vais touiller un peu dans le source pour voir ce que ça donne. Je garde bon espoir.
A vrai dire, je préfère tout tenter avant de me lancer dans la réécriture du driver (ce que je n'ai d'ailleurs jamais fait) car je sais que les drivers pour Windows, c'est la folie !

Reply

Marsh Posté le 29-07-2004 à 14:27:25    

m0rbac a écrit :

j'ai trouvé un utilitaire en VisualBasic (pour ceux que ça intéresse: http://sourceforge.net/projects/vbtablet/) qui capte les coordonnées de la tablette.


Je suis pas sûr que ce soit ce que tu cherches :

Citation :

I'm a programmer, so naturally I tried to do something with it, only to find that there was very little support for VB, and only via the standard (C/C++ based) API. So I made my own. VBTablet encapsulates the WinTab API in an easy-to-use ActiveX component DLL



---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 29-07-2004 à 20:31:10    

Oui, je devrais sûrement chercher du côté de l'API WinTab. Mais dans l'immédiat, le langage utilisé m'importe peu. Peut-être que par la suite j'essaierai de faire quelque chose de plus propre. Je veux déjà voir si j'arrive à faire le truc que je veux, qui marche comme je l'entends, pas besoin que ça soit hyper boosté.
 
Donc pour le moment j'ai torché un truc vite fait en VB qui me fait le mapping des coordonnées. Ca marche bien, mais il reste à fixer un dernière problème (qui était d'ailleurs prévu): maintenant j'aimerais pouvoir "cliquer" sur la tablette, j'entends par là, faire une pression avec le stylet. Or comme je clique forcément en dehors de l'application VB, je perds le focus sur l'application et le mapping s'arrête :( Donc il faut que j'arrive à faire tourner l'appli en background de manière permanente.
Il faut dire que dans ce domaine je sèche un peu. Je suis toujours en train de chercher dans la doc et les tuts, mais si qqun sait comment faire, je suis preneur.
 
Merci encore pour l'aide  :bounce:  
 
ps: il semble que le topic s'oriente de plus en plus vers VisualBasic... mmmh dans une section C/C++, ça fait désordre  :whistle:

Reply

Marsh Posté le 30-07-2004 à 12:31:30    

Citation :

Or comme je clique forcément en dehors de l'application VB, je perds le focus sur l'application et le mapping s'arrête


Il faut capturer la souris (SetCapture).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed