2015-08-11 7 views
2

При попытке обновить свою позицию мыши из lLastX и lLastY членов RAWMOUSE структуры в то время как я вошел в через RDP, я получаю некоторые действительно странно числа (например,> 30 000 для обоих). Я заметил это поведение в Windows 7, 8, 8.1 и 10.Raw lastx ввода мышь, ласты с нечетными значениями при входе в систему через RDP

Член usFlags возвращает значение MOUSE_MOVE_ABSOLUTE | MOUSE_VIRTUAL_DESKTOP. Что касается MOUSE_MOVE_ABSOLUTE, я занимаюсь абсолютным позиционированием, а также относительным в своем коде. Тем не менее, флаг виртуального рабочего стола меня немного смущает, поскольку я предположил, что флаг предназначен для настройки нескольких мониторов. У меня такое чувство, что есть связь с этим флагом и странными цифрами, которые я получаю. К сожалению, я действительно не знаю, как настроить значения без точки отсчета, и я даже не знаю, как получить точку отсчета.

Когда я запускаю свой код локально, все работает так, как должно.

Знаете ли вы, у кого есть идеи, почему RDP + Raw Input дал бы мне такие испорченные мышью lastx/lasty значения? И если так, есть ли способ, чтобы я мог преобразовать их в более разумные ценности?

ответ

3

Оказывается, что при использовании WM_INPUT через удаленный рабочий стол, то MOUSE_MOVE_ABSOLUTE и MOUSE_VIRTUAL_DESKTOP биты установлены, и значение, кажется, в пределах от 0 до USHRT_MAX.

Я никогда не нашел четкой документации о том, какая система координат используется, когда MOUSE_VIRTUAL_DESKTOP бит установлен, но это, кажется, работает хорошо до сих пор:

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; 

 Смежные вопросы

  • Нет связанных вопросов^_^