void Update() { foreach (var downKeys in downKeysByDeviceId) { downKeys.Value.Clear(); } foreach (var upKeys in upKeysByDeviceId) { upKeys.Value.Clear(); } // Poll the events and properly update whatever we need IntPtr data = poll(); int numEvents = Marshal.ReadInt32(data); for (int i = 0; i < numEvents; ++i) { var ev = new RawInputEvent(); long offset = data.ToInt64() + sizeof(int) + i * Marshal.SizeOf(ev); ev.devHandle = Marshal.ReadInt32(new IntPtr(offset + 0)); ev.x = Marshal.ReadInt32(new IntPtr(offset + 4)); ev.y = Marshal.ReadInt32(new IntPtr(offset + 8)); ev.wheel = Marshal.ReadInt32(new IntPtr(offset + 12)); ev.press = Marshal.ReadByte(new IntPtr(offset + 16)); ev.release = Marshal.ReadByte(new IntPtr(offset + 17)); ev.type = Marshal.ReadByte(new IntPtr(offset + 18)); ev.padding0 = Marshal.ReadByte(new IntPtr(offset + 19)); ev.keyboardFlags = (ushort)Marshal.ReadInt16(new IntPtr(offset + 20)); ev.keyboardVkey = (ushort)Marshal.ReadInt16(new IntPtr(offset + 22)); ev.keyboardMakeCode = (ushort)Marshal.ReadInt16(new IntPtr(offset + 24)); if (ev.type == RE_DEVICE_CONNECT) { if (verbose) { Debug.LogFormat("Device connected: handle {0}", ev.devHandle); } SendMessageUpwards("OnInputDeviceConnect", ev.devHandle, SendMessageOptions.DontRequireReceiver); } else if (ev.type == RE_DEVICE_DISCONNECT) { if (verbose) { Debug.LogFormat("Device disconnected: handle {0}", ev.devHandle); } SendMessageUpwards("OnInputDeviceDisconnect", ev.devHandle, SendMessageOptions.DontRequireReceiver); } else if (ev.type == RE_KEYBOARD) { var isBreakBitSet = ((ev.keyboardFlags & Win32.RI_KEY_BREAK) != 0); var isE0BitSet = ((ev.keyboardFlags & Win32.RI_KEY_E0) != 0); var keyName = KeyMapper.GetKeyName(Win32.VirtualKeyCorrection(ev.keyboardVkey, isE0BitSet, ev.keyboardMakeCode)).ToUpper(); if (verbose) { Debug.LogFormat("{0} H:{1} Key:{2} Break:{3} Flags:{4} Vkey:{5}", getEventName(ev.type), ev.devHandle, keyName, isBreakBitSet, ev.keyboardFlags, ev.keyboardVkey); } // Pressed keys if (!keysByDeviceId.ContainsKey(ev.devHandle)) { keysByDeviceId[ev.devHandle] = new Dictionary <string, bool>(); } var oldPressed = GetKey(ev.devHandle, keyName); var newPressed = (isBreakBitSet == false); keysByDeviceId[ev.devHandle][keyName] = newPressed; // Down keys if (!downKeysByDeviceId.ContainsKey(ev.devHandle)) { downKeysByDeviceId[ev.devHandle] = new Dictionary <string, bool>(); } if (oldPressed == false && newPressed == true) { downKeysByDeviceId[ev.devHandle][keyName] = true; } // Up keys if (!upKeysByDeviceId.ContainsKey(ev.devHandle)) { upKeysByDeviceId[ev.devHandle] = new Dictionary <string, bool>(); } if (oldPressed == true && newPressed == false) { upKeysByDeviceId[ev.devHandle][keyName] = true; } } } Marshal.FreeCoTaskMem(data); if (verbose) { foreach (var pk in downKeysByDeviceId) { foreach (var k in pk.Value) { if (k.Value) { Debug.LogFormat("Dev Handle: {0} Key Down: {1}", pk.Key, k.Key); } } } foreach (var pk in upKeysByDeviceId) { foreach (var k in pk.Value) { if (k.Value) { Debug.LogFormat("Dev Handle: {0} Key Up: {1}", pk.Key, k.Key); } } } } }
void Update() { IntPtr data = poll(); int numEvents = Marshal.ReadInt32(data); if (numEvents > 0) { lastEvents = numEvents; } for (int i = 0; i < numEvents; ++i) { var ev = new RawInputEvent(); long offset = data.ToInt64() + sizeof(int) + i * Marshal.SizeOf(ev); ev.devHandle = Marshal.ReadInt32(new IntPtr(offset + 0)); ev.x = Marshal.ReadInt32(new IntPtr(offset + 4)); ev.y = Marshal.ReadInt32(new IntPtr(offset + 8)); ev.wheel = Marshal.ReadInt32(new IntPtr(offset + 12)); ev.press = Marshal.ReadByte(new IntPtr(offset + 16)); ev.release = Marshal.ReadByte(new IntPtr(offset + 17)); ev.type = Marshal.ReadByte(new IntPtr(offset + 18)); if (ev.type == RE_DEVICE_CONNECT) { addCursor(ev.devHandle); } else if (ev.type == RE_DEVICE_DISCONNECT) { deleteCursor(ev.devHandle); } else if (ev.type == RE_MOUSE) { MousePointer pointer = null; if (pointersByDeviceId.TryGetValue(ev.devHandle, out pointer)) { float dx = ev.x * pointer.sensitivity; float dy = ev.y * pointer.sensitivity; pointer.delta = new Vector2(dx, dy); //Invisible while not moving pointer.obj.transform.position += new Vector3(dx, -dy, 0); if (Mathf.Abs(dx) > accelerationThreshold) { dx *= accelerationMultiplier; } if (Mathf.Abs(dy) > accelerationThreshold) { dy *= accelerationMultiplier; } RectTransform rect = pointer.obj.transform.parent.GetComponent <RectTransform>(); pointer.obj.transform.position = new Vector3( Mathf.Clamp(pointer.obj.transform.position.x, 0, rect.rect.width - screenBorderPixels), Mathf.Clamp(pointer.obj.transform.position.y, 0, rect.rect.height - screenBorderPixels), pointer.obj.transform.position.z); if ((int)ev.press != 0) { Interaction(pointer, (MouseButton)ev.press, ActionType.PRESSED); } if ((int)ev.release != 0) { Interaction(pointer, (MouseButton)ev.release, ActionType.RELEASED); } if (dx != 0 || dy != 0) { Interaction(pointer, MouseButton.NONE, ActionType.MOVEMENT); } } else { Debug.Log("Unknown device found"); addCursor(ev.devHandle); } } } Marshal.FreeCoTaskMem(data); }