Enumerating Microsoft DirectInput Devices |
In order to capture device input using Microsoft DirectInput, you have to know from which device you want to capture, and if it is currently attached to the user's computer. You can do this by enumerating DeviceInstance objects using several different static methods of the Manager class.
You should enumerate when you are looking for a particular kind of device, want to offer the user a choice of devices, or need to work with two or more devices.
Enumeration serves three purposes:
[C#]
private void PopulateAllDevices(TreeView tvDevices) { //Add "All Devices" node to TreeView TreeNode allNode = new TreeNode("All Devices"); tvDevices.Nodes.Add(allNode); //Populate All devices foreach(DeviceInstance di in Manager.Devices) { //Get Device name TreeNode nameNode = new TreeNode(di.InstanceName); //Is device attached? TreeNode attachedNode = new TreeNode( "Attached = " + Manager.GetDeviceAttached(di.ProductGuid)); //Get device Guid TreeNode guidNode = new TreeNode( "Guid = " + di.InstanceGuid); //Add nodes nameNode.Nodes.Add(attachedNode); nameNode.Nodes.Add(guidNode); allNode.Nodes.Add(nameNode); } }
To enumerate a particular type of device, such as keyboards, you can use the GetDevices method of the Manager class. GetDevices is a static method allows you to retrieve a collection of DeviceInstance objects of a certain type, like keyboards. It has a parameter that gives you the ability to pass it a flag or a combination of flags in order to filter the collection. In this way, you can retrieve a list containing only attached keyboards.
The following C# sample code is used to populate a TreeView control with all attached keyboards.[C#]
private void PopulateKeyboards(TreeView tvDevices) { //Add "Keyboard Devices" node to TreeView TreeNode keyboardNode = new TreeNode("Keyboard Devices"); tvInputDevices.Nodes.Add(keyboardNode); //Populate Attached Keyboards foreach(DeviceInstance di in Manager.GetDevices(DeviceType.Keyboard,EnumDevicesFlags.AttachedOnly)) { //Get device name TreeNode nameNode = new TreeNode(di.InstanceName); TreeNode guidNode = new TreeNode( "Guid = " + di.InstanceGuid); //Add nodes nameNode.Nodes.Add(guidNode); keyboardNode.Nodes.Add(nameNode); } }
When enumerating pointing devices on the user's computer, you likely will not want to limit yourself to just a mouse pointer. Some laptops use track-pads or other types of pointing devices.
The C# sample below illustrates how to use the DeviceClass enumeration with the GetDevices method to populate a TreeView control with all attached devices that fall into the screen pointer class, such as mice or track-pads.[C#]
private void PopulatePointers(TreeView tvDevices) { //Add "Pointer Devices" node to TreeView TreeNode pointerNode = new TreeNode("Pointer Devices"); tvInputDevices.Nodes.Add(pointerNode); //Populate Attached Mouse/Pointing Devices foreach(DeviceInstance di in Manager.GetDevices(DeviceClass.Pointer,EnumDevicesFlags.AttachedOnly)) { //Get device name TreeNode nameNode = new TreeNode(di.InstanceName); nameNode.Tag = di; TreeNode guidNode = new TreeNode( "Guid = " + di.InstanceGuid); //Add nodes nameNode.Nodes.Add(guidNode); pointerNode.Nodes.Add(nameNode); } }
Sometimes you may want to just enumerate devices that have force feedback capabilities. Because many different types of devices use force feedback, you may need to look for any type of device that supports it.
The following C# sample code illustrates how to enumerate all devices that support force feedback, and populate a TreeView control with those devices.[C#]
private void PopulateForceFeedback(TreeView tvDevices) { //Add "ForceFeedback Devices" node to TreeView TreeNode forcefeedbackNode = new TreeNode("ForceFeedback Devices"); tvInputDevices.Nodes.Add(forcefeedbackNode); //Populate ForceFeedback Devices foreach(DeviceInstance di in Manager.GetDevices( DeviceClass.All,EnumDevicesFlags.ForceFeedback)) { //Get device name TreeNode nameNode = new TreeNode(di.InstanceName); nameNode.Tag = di; TreeNode guidNode = new TreeNode("Guid = " + di.InstanceGuid); //Add nodes nameNode.Nodes.Add(guidNode); forcefeedbackNode.Nodes.Add(nameNode); } }
Send comments about this topic to Microsoft. © Microsoft Corporation. All rights reserved.
Feedback? Please provide us with your comments on this topic.
For more help, visit the DirectX Developer Center