2015-08-11 4 views
2

Lorsque j'essaie de mettre à jour la position de ma souris depuis les lLastX et lLastY membres de la structure RAWMOUSE pendant que je suis connecté via RDP, je deviens vraiment bizarre nombres (comme> 30 000 pour les deux). J'ai remarqué ce comportement sur Windows 7, 8, 8.1 et 10.Entrée brute mouse lastx, lasty avec des valeurs impaires lors de la connexion à RDP

Le membre usFlags renvoie la valeur MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP. En ce qui concerne le MOUSE_MOVE_ABSOLUTE, je gère le positionnement absolu ainsi que le relatif dans mon code. Cependant, le drapeau de bureau virtuel m'a un peu confus car je supposais que le drapeau était pour une configuration multi-moniteur. J'ai l'impression qu'il y a un lien avec ce drapeau et les chiffres étranges que je reçois. Malheureusement, je ne sais vraiment pas comment ajuster les valeurs sans un point de référence, et je ne sais même pas comment obtenir un point de référence. Lorsque je cours mon code localement, tout fonctionne comme il se doit.

Alors, est-ce que quelqu'un a une idée de la raison pour laquelle RDP + Raw Input me donnerait des valeurs lastx/lasty de la souris? Et si oui, y a-t-il un moyen de les convertir en valeurs plus sensibles?

Répondre

3

Il semble que lors de l'utilisation WM_INPUT par le bureau à distance, les bits sont MOUSE_MOVE_ABSOLUTE et MOUSE_VIRTUAL_DESKTOP, et les valeurs semble être comprise 0-USHRT_MAX.

Je ne ai jamais vraiment trouvé une documentation indiquant clairement le système de coordonnées est utilisé lorsque MOUSE_VIRTUAL_DESKTOP bit est défini, mais cela semble avoir bien fonctionné jusqu'ici:

case WM_INPUT: { 
    UINT buffer_size = 48; 
    LPBYTE buffer[48]; 
    GetRawInputData((HRAWINPUT)lparam, RID_INPUT, buffer, &buffer_size, sizeof(RAWINPUTHEADER)); 
    RAWINPUT* raw = (RAWINPUT*)buffer; 
    if (raw->header.dwType != RIM_TYPEMOUSE) { 
     break; 
    } 
    const RAWMOUSE& mouse = raw->data.mouse; 
    if ((mouse.usFlags & MOUSE_MOVE_ABSOLUTE) == MOUSE_MOVE_ABSOLUTE) { 
     static Vector3 last_pos = vector3(FLT_MAX, FLT_MAX, FLT_MAX); 
     const bool virtual_desktop = (mouse.usFlags & MOUSE_VIRTUAL_DESKTOP) == MOUSE_VIRTUAL_DESKTOP; 
     const int width = GetSystemMetrics(virtual_desktop ? SM_CXVIRTUALSCREEN : SM_CXSCREEN); 
     const int height = GetSystemMetrics(virtual_desktop ? SM_CYVIRTUALSCREEN : SM_CYSCREEN); 
     const Vector3 absolute_pos = vector3((mouse.lLastX/float(USHRT_MAX)) * width, (mouse.lLastY/float(USHRT_MAX)) * height, 0); 
     if (last_pos != vector3(FLT_MAX, FLT_MAX, FLT_MAX)) { 
      MouseMoveEvent(absolute_pos - last_pos); 
     } 
     last_pos = absolute_pos; 
    } 
    else { 
     MouseMoveEvent(vector3((float)mouse.lLastX, (float)mouse.lLastY, 0)); 
    } 
} 
break;