2016-07-16 6 views
0

の値を変更するので、私はDLLP /呼び出しは、渡された引数

__declspec(dllexport) MOUSERAWDATA __stdcall GetMouseRawData(LPARAM lParam) 
{ 
    UINT bufferSize = 0; 
    BYTE *buffer = new BYTE[bufferSize]; 
    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &bufferSize, sizeof(RAWINPUTHEADER)); 
    GetRawInputData((HRAWINPUT)lParam, RID_INPUT, (LPVOID)buffer, &bufferSize, sizeof(RAWINPUTHEADER)); 
    RAWINPUT *raw = (RAWINPUT*)buffer; 
    MOUSERAWDATA data; 
    if (raw->header.dwType == RIM_TYPEMOUSE) 
    { 
     data.longX = raw->data.mouse.lLastX; 
     data.longY = raw->data.mouse.lLastY; 
    } 
    return data; 
} 

そして次には、このC++の機能を持っている私のC#プロジェクトである:

[DllImport("RawInput.dll", CallingConvention = CallingConvention.StdCall)] 
private static extern MouseRawData GetMouseRawData(IntPtr lParam); 
. 
. 
. 
protected override void WndProc(ref Message m) 
{ 
    switch(m.Msg) 
    { 
     case WM_CREATE: 
      if (AttachMouseListener(this.Handle)) 
       Console.WriteLine("It works!"); 
      break; 
     case WM_INPUT: 
      MouseRawData data = GetMouseRawData(m.LParam); 
      break; 
     default: 
      base.WndProc(ref m); 
      break; 
    } 
} 

私はこのコードを実行すると、以下の値がGetMouseRawData

The value being passed

しかし、いくつかのREASのために渡され、 C++側のlParamの値は常に異なっています。

enter image description here

これがなぜ起こるか私は、この場合の0x004fe95c = 5237084

誰もが知っていますか?

+1

あなたのPInvoke宣言があなたのCの関数と一致していません。おそらく、MouseRawData宣言のために、それを見ないという利点があります。構造体を返す関数は、常に難しいです。代わりに、GetMouseRawData(LPARAM lParam、MOUSERAWDATA * data)を使用してください。 –

答えて

1

長さ0のバッファを割り当てています。次に、バッファのサイズを "尋ねる"。そしてあなたのバッファが正しいサイズであることを彼らに伝えることによってGetRawInputDataに横たわってください。必要なバッファーのサイズを学習した最初の呼び出し後のポイントにバッファー割り当てを移動します。

UINT bufferSize = 0; 
BYTE *buffer = new BYTE[bufferSize]; 
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, NULL, &bufferSize, sizeof(RAWINPUTHEADER)); 
GetRawInputData((HRAWINPUT)lParam, RID_INPUT, (LPVOID)buffer, &bufferSize, sizeof(RAWINPUTHEADER)); 
RAWINPUT *raw = (RAWINPUT*)buffer; 

リークを防ぐには、バッファーをdelete[]にする必要があります。 条件付きでゴミが入るのを防ぐには、data(MOUSERAWDATA)を初期化する必要があります。 raw->header.dwType == RIM_TYPEMOUSEがtrueまたはfalseであることを発信者はどのように知るでしょうか?

は直接Microsoft guidanceごとに)あなただけの(GetRawInputDataをpinvoking考えた:

public static extern int GetRawInputData(IntPtr hRawInput, RawInputCommand uiCommand, out RAWINPUT pData, ref int pcbSize, int cbSizeHeader); 

protected override void WndProc(ref Message m) 
{ 
    if (m.Msg == (int)WindowMessages.RawInput) // WindowMessages.RawInput = 0x00FF (WM_INPUT) 
    { 
     RAWINPUT input = new RAWINPUT(); 
     int outSize = 0; 
     int size = Marshal.SizeOf(typeof(RAWINPUT)); 

     outSize = Win32API.GetRawInputData(m.LParam, RawInputCommand.Input, out input, ref size, Marshal.SizeOf(typeof(RAWINPUTHEADER))); 
     if (outSize != -1) 
     { 
      if (input.Header.Type == RawInputType.Mouse) 
      { 
       //input.Mouse.LastX; 
       //input.Mouse.LastY; 
      } 
     } 
    } 
    base.WndProc(ref m); 
} 
+0

入力いただきありがとうございます。しかし、あなたの答えは、渡される値が変化している理由を私に教えてくれません。 – Abhinav

+0

同じビット数で.netとC++をビルドしていることを確認できますか? 64ビットまたは両方の32ビット。 IntPtrは異なるサイズになります。 –

関連する問題