2013-07-05 67 views
1

我最近開始閱讀Beginning DirectX 11 Programming(Allen Sherrod,Wendy Jones),並且偶然發現了一個有關輸入的問題。本書只教我如何使用Win32,DirectInput和XInput進行輸入處理。然而,經過一番研究,我意識到我應該使用RawInput進行輸入處理。這是問題出現的地方。原始鼠標輸入的解釋

我已經設法讓我的應用程序接收原始鼠標輸入。我對你們的問題是:如何解釋原始鼠標數據並將其用於我的遊戲,與您如何使用WM_MOUSEMOVE類似?

編輯:對不起,表達自己不好。我想知道鼠標指針在我的應用程序屏幕中的位置,但不明白鼠標原始輸入的值。 (MX,MY)

case WM_INPUT: 
    { 
     UINT bufferSize; 
     GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &bufferSize, sizeof(RAWINPUTHEADER)); 
     BYTE *buffer = new BYTE[bufferSize]; 
     GetRawInputData((HRAWINPUT)lParam, RID_INPUT, (LPVOID)buffer, &bufferSize, sizeof(RAWINPUTHEADER)); 

     RAWINPUT *raw = (RAWINPUT*) buffer; 

     if (raw->header.dwType == RIM_TYPEMOUSE) 
     { 
      long mX = raw->data.mouse.lLastX; 
      long mY = raw->data.mouse.lLastY; 
     } 
    } 
+0

Win32是一個比你想象的更廣的領域。也許你的意思是它教你窗口消息。 – chris

+0

這是一個非常寬泛且通用的問題。嚴格來說,您可以通過調用相關的API函數來使用它。 – DanielKO

+0

每次收到鼠標輸入時都有內存泄漏。這不是你想要的。使用矢量。 – chris

回答

1

您可以通過做這樣實現這一點:

case WM_INPUT: 
{ 
    UINT dwSize = 40; 
    static BYTE lpb[40]; 

    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, 
        lpb, &dwSize, sizeof(RAWINPUTHEADER)); 

    RAWINPUT* raw = (RAWINPUT*)lpb; 

    if (raw->header.dwType == RIM_TYPEMOUSE) 
    { 
     int xPosRelative = raw->data.mouse.lLastX; 
     int yPosRelative = raw->data.mouse.lLastY; 
    } 
    break; 
} 

Mouse movement with WM_INPUT(本條適用於非高清藏漢)提及。該文章還包含WM_MOUSEMOVE的示例。

+1

Floris Velleman,這裏需要注意的是「dwSize」的值不會是40! (即,對於64位應用程序,值將是48) – Gediminas