/// <summary> /// Update labels on window with Device data /// </summary> /// <param name="Controller"></param> public void UpdateRawAxis(RawInputController Controller) { Lbl_RawInput.Text = "[ 0x" + Controller.Computed_X.ToString("X8") + ", " + Controller.Computed_Y.ToString("X8") + " ]"; Lbl_AxisXMin.Text = Controller.Axis_X_Min.ToString() + " [ 0x" + Controller.Axis_X_Min.ToString("X8") + " ]"; Lbl_AxisXMax.Text = Controller.Axis_X_Max.ToString() + " [ 0x" + Controller.Axis_X_Max.ToString("X8") + " ]"; Lbl_AxisYMin.Text = Controller.Axis_Y_Min.ToString() + " [ 0x" + Controller.Axis_Y_Min.ToString("X8") + " ]"; Lbl_AxisYMax.Text = Controller.Axis_Y_Max.ToString() + " [ 0x" + Controller.Axis_Y_Max.ToString("X8") + " ]"; // Update screen/client info GetScreenResolution(); GetClientSize(); // Convert RAW to SCREEN Controller.Computed_X = ScreenScale(Controller.Computed_X, Controller.Axis_X_Min, Controller.Axis_X_Max, 0, _ScreenWidth); Controller.Computed_Y = ScreenScale(Controller.Computed_Y, Controller.Axis_Y_Min, Controller.Axis_Y_Max, 0, _ScreenHeight); _OnScreenX = Controller.Computed_X; _OnScreenY = Controller.Computed_Y; Lbl_OnScreen.Text = _OnScreenX.ToString() + "x" + _OnScreenY.ToString(); // Convert SCREEN to CLIENT AxisInfo i = new AxisInfo(); i.pTarget.X = Controller.Computed_X; i.pTarget.Y = Controller.Computed_Y; ClientScale(i); Lbl_OnClient.Text = _OnClientX.ToString() + "x" + _OnClientY.ToString(); // Display mark on client, moved to Timer to not overload GUI thread with too many rawinout data drawing //this.Invalidate(); //Custom crosshair with PNG, not displaying well at all.... //SetTargetLocation(i.pTarget.X, i.pTarget.Y); }
/// <summary> /// Enumerates the Raw Input Devices and places their corresponding RawInputDevice structures into a List<string> /// We just filter to remove Keyboard devices and keep Mouse + HID devices /// </summary> private void GetRawInputDevices() { uint deviceCount = 0; var dwSize = (Marshal.SizeOf(typeof(RawInputDeviceList))); if (Win32API.GetRawInputDeviceList(IntPtr.Zero, ref deviceCount, (uint)dwSize) == 0) { var pRawInputDeviceList = Marshal.AllocHGlobal((int)(dwSize * deviceCount)); Win32API.GetRawInputDeviceList(pRawInputDeviceList, ref deviceCount, (uint)dwSize); for (var i = 0; i < deviceCount; i++) { // On Window 8 64bit when compiling against .Net > 3.5 using .ToInt32 you will generate an arithmetic overflow. Leave as it is for 32bit/64bit applications RawInputDeviceList rid = (RawInputDeviceList)Marshal.PtrToStructure(new IntPtr((pRawInputDeviceList.ToInt64() + (dwSize * i))), typeof(RawInputDeviceList)); RawInputController c = new RawInputController(rid.hDevice, rid.dwType); if (c.DeviceType == RawInputDeviceType.RIM_TYPEHID || c.DeviceType == RawInputDeviceType.RIM_TYPEMOUSE) { _Controllers.Add(c); } } Marshal.FreeHGlobal(pRawInputDeviceList); return; } throw new Win32Exception(Marshal.GetLastWin32Error()); }
/// <summary> /// Change of selected device in the list /// </summary> private void Cbo_Dev_SelectionChangeCommitted(object sender, System.EventArgs e) { _OnClientX = -1000; _OnClientY = -1000; if (Cbo_Dev.Text.Length > 0) { RawInputController Controller = GetControllerFromName(Cbo_Dev.Text); Lbl_dwType.Text = Controller.DeviceType.ToString() + " - " + Controller.DHidUsage; Lbl_Manufacturer.Text = Controller.ManufacturerName; Lbl_Product.Text = Controller.ProductName; Lbl_PID.Text = Controller.PID; Lbl_VID.Text = Controller.VID; _Btn_List.Clear(); Lbl_Nbr_Buttons.Text = Controller.NumberOfButtons.ToString(); FlowPanelButtons.Controls.Clear(); for (int i = 0; i < Controller.NumberOfButtons; i++) { Ds_Diag_Button b = new Ds_Diag_Button(i + 1); b.Width = 15; b.Height = 15; FlowPanelButtons.Controls.Add(b); _Btn_List.Add(b); } if (Controller.DeviceType != RawInputDeviceType.RIM_TYPEHID) { Lbl_AxisX_Txt.Visible = false; Lbl_AxisY_Txt.Visible = false; Lbl_Nbr_Axis_Txt.Visible = false; Lbl_Nbr_Axis.Visible = false; Cbo_AxisX.Visible = false; Cbo_AxisY.Visible = false; } else { Lbl_AxisX_Txt.Visible = true; Lbl_AxisY_Txt.Visible = true; Lbl_Nbr_Axis_Txt.Visible = true; Lbl_Nbr_Axis.Visible = true; Cbo_AxisX.Visible = true; Cbo_AxisY.Visible = true; Lbl_Nbr_Axis.Text = Controller.NumberOfAxis.ToString(); Cbo_AxisX.Items.Clear(); Cbo_AxisY.Items.Clear(); for (int i = 0; i < Controller.AxisList.Count; i++) { Cbo_AxisX.Items.Add("0x" + Controller.AxisList[i].ToString("X2")); Cbo_AxisY.Items.Add("0x" + Controller.AxisList[i].ToString("X2")); } if (Cbo_AxisX.Items.Count > 1) { Cbo_AxisX.SelectedItem = Cbo_AxisX.Items[1]; Cbo_AxisY.SelectedItem = Cbo_AxisX.Items[0]; Controller.Selected_AxisX = ushort.Parse(Cbo_AxisX.Text.Substring(2), System.Globalization.NumberStyles.HexNumber); Controller.Selected_AxisY = ushort.Parse(Cbo_AxisY.Text.Substring(2), System.Globalization.NumberStyles.HexNumber); } } _SelectedDevice = Cbo_Dev.Text; Btn_Export.Visible = true; } else { Btn_Export.Visible = false; } }
/// <summary> /// Export device HID specifications for analysis /// </summary> private void Btn_Export_Click(object sender, EventArgs e) { RawInputController c = GetControllerFromName(Cbo_Dev.Text); String DataFile = Application.StartupPath + @"\DsDiag_Report_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".txt"; System.IO.StreamWriter sw = new System.IO.StreamWriter(DataFile, false); try { sw.WriteLine("----- Ds_Diag.exe Device Report File -----"); sw.WriteLine("Device Name = " + c.DeviceName); sw.WriteLine("Device Type = " + c.DeviceType); if (c.DeviceType == RawInputDeviceType.RIM_TYPEHID) { sw.WriteLine("HID Usage = " + c.DHidUsage.ToString()); } sw.WriteLine("VID = " + c.VID); sw.WriteLine("PID = " + c.PID); sw.WriteLine("Device Description = " + c.ManufacturerName + " - " + c.ProductName); sw.WriteLine("Number of Buttons = " + c.NumberOfButtons); sw.WriteLine("Number of Axis = " + c.NumberOfAxis); string s = string.Empty; for (int i = 0; i < c.NumberOfAxis; i++) { s += "0x" + c.AxisList[i].ToString("X2") + ", "; } sw.WriteLine("Axis List = " + s); if (c.DeviceType == RawInputDeviceType.RIM_TYPEHID) { sw.WriteLine("----- HID detailed data -----"); sw.WriteLine("Device Capabilities:"); sw.WriteLine("+ " + c.HID_Capabilities.ToString().Replace(", ", "\n+ ")); sw.WriteLine(""); sw.WriteLine("Button Capabilities :"); for (int i = 0; i < c.HID_ButtonCapabilitiesArray.Length; i++) { sw.WriteLine("+ [" + i.ToString("D2") + "]\n + " + c.HID_ButtonCapabilitiesArray[i].ToString().Replace(", ", "\n + ")); } sw.WriteLine(""); sw.WriteLine("Values Capabilities :"); for (int i = 0; i < c.HID_ValueCapabilitiesArray.Length; i++) { sw.WriteLine("+ [" + i.ToString("D2") + "]\n + " + c.HID_ValueCapabilitiesArray[i].ToString().Replace(", ", "\n + ")); } sw.WriteLine(""); sw.WriteLine("Values Capabilities :"); for (int i = 0; i < c.HID_OutputValueCapabilitiesArray.Length; i++) { sw.WriteLine("+ [" + i.ToString("D2") + "]\n + " + c.HID_OutputValueCapabilitiesArray[i].ToString().Replace(", ", "\n + ")); } } } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } finally { sw.Close(); MessageBox.Show("Device report saved to :\n" + DataFile); } }
private void Cbo_AxisY_SelectionChangeCommitted(object sender, EventArgs e) { RawInputController c = GetControllerFromName(Cbo_Dev.Text); c.Selected_AxisY = ushort.Parse(Cbo_AxisY.Text.Substring(2), System.Globalization.NumberStyles.HexNumber); }