/// <summary> /// Populate our tree view with our devices. /// </summary> private void PopulateDeviceList() { treeViewDevices.Nodes.Clear(); //Create our list of HID devices PopulateDeviceList(treeViewDevices); treeViewDevices.CollapseAll(); //Hide check boxes //treeViewDevices.Nodes.OfType<TreeNode>().ToList().ForEach(n => TreeViewUtils.HideCheckBox(treeViewDevices,n)); //Do it twice because of that bug where the first node we hit is not hiding its checkbox as it should. treeViewDevices.Nodes.OfType <TreeNode>().ToList().ForEach(n => n.Nodes.OfType <TreeNode>().ToList().ForEach(on => TreeViewUtils.HideCheckBox(treeViewDevices, on))); treeViewDevices.Nodes.OfType <TreeNode>().ToList().ForEach(n => n.Nodes.OfType <TreeNode>().ToList().ForEach(on => TreeViewUtils.HideCheckBox(treeViewDevices, on))); foreach (TreeNode node in treeViewDevices.Nodes) { Hid.Device device = (Hid.Device)node.Tag; if (!(device.DeviceType == Hid.DeviceType.Hid)) { //Now allowing mouse and keyboard to register too //Do not allow registering mice and keyboards for now //TreeViewUtils.HideCheckBox(treeViewDevices, node); } } //Dump our devices to our logs richTextBoxLogs.AppendText(TreeViewUtils.TreeViewToText(treeViewDevices)); }
private void deviceNodeToolStripMenuItem_Click(object sender, EventArgs e) { // Walk up the tree until we find our device TreeNode node = treeViewDevices.SelectedNode; while (!(node.Tag is Hid.Device)) { node = node.Parent; } Hid.Device device = (Hid.Device)node.Tag; // Then show our porpeties dialog OpenPropertiesDialog(device.Name); }
/// <summary> /// Check some devices for registration /// </summary> void CheckDefaultDevices() { uint mceUsageId = (uint)Hid.UsagePage.WindowsMediaCenterRemoteControl << 16 | (uint)Hid.UsageCollection.WindowsMediaCenter.WindowsMediaCenterRemoteControl; uint consumerUsageId = (uint)Hid.UsagePage.Consumer << 16 | (uint)Hid.UsageCollection.Consumer.ConsumerControl; uint gamepadUsageId = (uint)Hid.UsagePage.GenericDesktopControls << 16 | (uint)Hid.UsageCollection.GenericDesktop.GamePad; foreach (TreeNode node in treeViewDevices.Nodes) { Hid.Device device = (Hid.Device)node.Tag; if (device.DeviceType == Hid.DeviceType.Keyboard || (device.DeviceType == Hid.DeviceType.Hid && (device.UsageId == mceUsageId || device.UsageId == consumerUsageId || device.UsageId == gamepadUsageId))) { node.Checked = true; } } }
/// <summary> /// Go through our device list and register the devices that are checked. /// </summary> void RegisterHidDevices() { // Register the input device to receive the commands from the // remote device. See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnwmt/html/remote_control.asp // for the vendor defined usage page. DisposeHandlers(); //Get our flags RadioButton checkedRadioButton = groupBoxRegistrationFlag.Controls.OfType <RadioButton>().FirstOrDefault(r => r.Checked); uint flags = uint.Parse((string)checkedRadioButton.Tag, System.Globalization.NumberStyles.HexNumber); // See: Const.RIDEV_EXINPUTSINK and Const.RIDEV_INPUTSINK //We collect our devices in a dictionary to remove duplicates Dictionary <uint, Hid.Device> devices = new Dictionary <uint, Hid.Device>(); foreach (TreeNode node in treeViewDevices.Nodes) { Hid.Device device = (Hid.Device)node.Tag; //Now allowing mouse and keyboard to register too if (node.Checked /*&& device.IsHid*/) { try { devices.Add(device.UsageId, device); } catch //(Exception ex) { //Just ignore duplicate UsageId Debug.WriteLine("Similar device already registered!"); } } } if (devices.Count == 0) { //No device to register for, nothing to do here return; } int i = 0; RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[devices.Count]; foreach (KeyValuePair <uint, Hid.Device> entry in devices) { rid[i].usUsagePage = entry.Value.UsagePage; rid[i].usUsage = entry.Value.UsageCollection; rid[i].dwFlags = (RawInputDeviceFlags)flags; rid[i].hwndTarget = Handle; i++; } /* * int i = 0; * rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.WindowsMediaCenterRemoteControl; * rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.WindowsMediaCenter.WindowsMediaCenterRemoteControl; * rid[i].dwFlags = flags; * rid[i].hwndTarget = Handle; * * i++; * rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.WindowsMediaCenterRemoteControl; * rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.WindowsMediaCenter.WindowsMediaCenterLowLevel; * rid[i].dwFlags = flags; * rid[i].hwndTarget = Handle; * * i++; * rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer; * rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.ConsumerControl; * rid[i].dwFlags = flags; * rid[i].hwndTarget = Handle; * * i++; * rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.Consumer; * rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.Consumer.Selection; * rid[i].dwFlags = flags; * rid[i].hwndTarget = Handle; * * i++; * rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls; * rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.SystemControl; * rid[i].dwFlags = flags; * rid[i].hwndTarget = Handle; * * i++; * rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls; * rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.GamePad; * rid[i].dwFlags = flags; * rid[i].hwndTarget = Handle; */ //i++; //rid[i].usUsagePage = (ushort)SharpLib.Hid.UsagePage.GenericDesktopControls; //rid[i].usUsage = (ushort)SharpLib.Hid.UsageCollection.GenericDesktop.Keyboard; //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK; //rid[i].hwndTarget = Handle; //i++; //rid[i].usUsagePage = (ushort)Hid.UsagePage.GenericDesktopControls; //rid[i].usUsage = (ushort)Hid.UsageCollection.GenericDesktop.Mouse; //rid[i].dwFlags = Const.RIDEV_EXINPUTSINK; //rid[i].hwndTarget = aHWND; iHidHandler = new SharpLib.Hid.Handler(rid, checkBoxRepeat.Checked, (int)numericRepeatDelay.Value, (int)numericRepeatSpeed.Value); if (!iHidHandler.IsRegistered) { Debug.WriteLine("Failed to register raw input devices: " + Marshal.GetLastWin32Error().ToString()); } if (checkBoxUseSingleHandler.Checked) { iHidParser = iHidHandler; } else { //For testing purposes we parse WM_INPUT messages from another Handler instance. iHidParser = new SharpLib.Hid.Handler(checkBoxRepeat.Checked, (int)numericRepeatDelay.Value, (int)numericRepeatSpeed.Value); } iHidParser.OnHidEvent += HandleHidEventThreadSafe; }