2009-12-21 4 views
2

En ce moment, lorsque je tente une boucle qui contient quelque chose comme:Déplacer la souris sans accélération en C++ en utilisant mouse_event

mouse_event(MOUSEEVENTF_MOVE,dx,dy,0,0); 

La souris a tendance à se déplacer plus (dx, dy). Recherche en ligne, je pense que c'est à cause de l'accélération appliquée par le système d'exploitation. Comment puis-je déplacer la souris d'un montant absolu? MOUSEEVENTF_ABSOLUTE semble être peut-être ce que je cherche, mais je ne vois pas comment l'utiliser.

J'ai essayé:

mouse_event(MOUSEEVENTF_ABSOLUTE || MOUSEEVENTF_MOVE,dx,dy,0,0); 

mais cela ne fonctionne pas non plus. Je préfère utiliser mouse_event plutôt que SetCursorPos ou d'autres méthodes, que dois-je faire? Merci.

+0

Vouliez-vous dire mettre 2 tuyaux dans (MOUSEEVENTF_ABSOLUTE || MOUSEEVENTF_MOVE) ou est-ce une faute de frappe? – justinlatimer

+0

Je l'ai eu comme || avant, mais je me rends compte que c'est faux. Je l'ai commuté à |, mais maintenant il finit juste de déplacer le curseur à (0,0) maintenant importe ce que dx ou dy sont – Dave61

Répondre

4

de winuser.h

#define MOUSEEVENTF_MOVE  0x0001 
#define MOUSEEVENTF_ABSOLUTE 0x8000 

MOUSEEVENTF_MOVE || MOUSEEVENTF_ABSOLUTE est la même chose que 0x0001 || 0x8001 qui évalue à true, qui se trouve être 1! Essayez de nouveau avec MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE et cela fonctionnera probablement.

Modifier: après avoir regardé les documents un peu, il semble que vous voulez MOUSEEVENTF_ABSOLUTE tout seul. ou vous devez tenir compte du fait que la plage de valeurs recherchée est 0-65535 mise à l'échelle sur l'ensemble de l'affichage.

Si la valeur MOUSEEVENTF_ABSOLUTE est spécifiée, dx et dy contiennent des coordonnées absolues normalisées comprises entre 0 et 65 535. La procédure événementielle mappe ces coordonnées sur la surface d'affichage. Coordonner (0,0) les cartes sur le coin supérieur gauche de la surface d'affichage, (65535,65535) les cartes sur le coin inférieur droit.

+0

Bon, quand je le mets à |, il déplace immédiatement le curseur sur le (0,0) spot, même quand j'essaie mouse_event (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 100,100,0,0) par exemple – Dave61

+0

a ajouté une citation je l'espère pertinente de la MS docs à ma réponse –

5

Les coordonnées ne sont pas des coordonnées de pixel et doivent être normalisées.

#include <Windows.h> 
#include <tchar.h> 

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { 
    INPUT input = {0}; 

    int screenX = GetSystemMetrics(SM_CXVIRTUALSCREEN); 
    int screenY = GetSystemMetrics(SM_CYVIRTUALSCREEN); 

    for(unsigned int i = 0; i < 10; i++) { 
    input.mi.dx = i*10 * (65535/screenX); 
    input.mi.dy = i*10 * (65535/screenY); 
    input.mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK | MOUSEEVENTF_MOVE; 
    input.type = INPUT_MOUSE; 

    SendInput(1, &input, sizeof INPUT); 
    Sleep(1000); 
    } 

    return ERROR_SUCCESS; 
} 

Je l'ai utilisé SendInput() ici au lieu de mouse_event() parce que ce dernier a été remplacé selon les documents. Si vous voulez le reconvertir, les paramètres devraient être sensiblement les mêmes.

Questions connexes