protected override void CreateDrivers() { this.keyboard_driver = new WinRawKeyboard(this.Parent.WindowHandle); this.mouse_driver = new WinRawMouse(this.Parent.WindowHandle); this.joystick_driver = new WinMMJoystick(); this.DevNotifyHandle = WinRawInput.RegisterForDeviceNotifications(this.Parent); }
protected override void Dispose(bool manual) { if (!IsDisposed) { if (manual) { WinRawInput raw = rawinput_driver; if (raw != null) { raw.Dispose(); rawinput_driver = null; } } base.Dispose(manual); } }
public void RefreshDevices() { lock (UpdateLock) { // Mark all devices as disconnected. We will check which of those // are connected later on. for (int i = 0; i < mice.Count; i++) { MouseState state = mice[i]; state.IsConnected = false; mice[i] = state; } // Discover mouse devices foreach (RawInputDeviceList dev in WinRawInput.GetDeviceList()) { ContextHandle id = new ContextHandle(dev.Device); if (rawids.ContainsKey(id)) { // Device already registered, mark as connected MouseState state = mice[rawids[id]]; state.IsConnected = true; mice[rawids[id]] = state; continue; } // Unregistered device, find what it is string name = GetDeviceName(dev); if (name.ToLower().Contains("root")) { // This is a terminal services device, skip it. continue; } else if (dev.Type == RawInputDeviceType.MOUSE || dev.Type == RawInputDeviceType.HID) { // This is a mouse or a USB mouse device. In the latter case, discover if it really is a // mouse device by qeurying the registry. RegistryKey regkey = FindRegistryKey(name); if (regkey == null) { continue; } string deviceDesc = (string)regkey.GetValue("DeviceDesc"); string deviceClass = (string)regkey.GetValue("Class") as string; if (deviceClass == null) { // Added to address OpenTK issue 3198 with mouse on Windows 8 string deviceClassGUID = (string)regkey.GetValue("ClassGUID"); RegistryKey classGUIDKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\" + deviceClassGUID); deviceClass = classGUIDKey != null ? (string)classGUIDKey.GetValue("Class") : string.Empty; } // deviceDesc remained null on a new Win7 system - not sure why. // Since the description is not vital information, use a dummy description // when that happens. if (String.IsNullOrEmpty(deviceDesc)) { deviceDesc = "Windows Mouse " + mice.Count; } else { deviceDesc = deviceDesc.Substring(deviceDesc.LastIndexOf(';') + 1); } if (!String.IsNullOrEmpty(deviceClass) && deviceClass.ToLower().Equals("mouse")) { if (!rawids.ContainsKey(new ContextHandle(dev.Device))) { // Register the device: RawInputDeviceInfo info = new RawInputDeviceInfo(); int devInfoSize = API.RawInputDeviceInfoSize; Functions.GetRawInputDeviceInfo(dev.Device, RawInputDeviceInfoEnum.DEVICEINFO, info, ref devInfoSize); RegisterRawDevice(Window, deviceDesc); MouseState state = new MouseState(); state.IsConnected = true; mice.Add(state); names.Add(deviceDesc); rawids.Add(new ContextHandle(dev.Device), mice.Count - 1); } } } } } }
public void RefreshDevices() { // Mark all devices as disconnected. We will check which of those // are connected below. foreach (var device in Devices) { device.SetConnected(false); } // Discover joystick devices int xinput_device_count = 0; foreach (RawInputDeviceList dev in WinRawInput.GetDeviceList()) { // Skip non-joystick devices if (dev.Type != RawInputDeviceType.HID) { continue; } // We use the device handle as the hardware id. // This works, but the handle will change whenever the // device is unplugged/replugged. We compensate for this // by checking device GUIDs, below. // Note: we cannot use the GUID as the hardware id, // because it is costly to query (and we need to query // that every time we process a device event.) IntPtr handle = dev.Device; bool is_xinput = IsXInput(handle); Guid guid = GetDeviceGuid(handle); long hardware_id = handle.ToInt64(); Device device = Devices.FromHardwareId(hardware_id); if (device != null) { // We have already opened this device, mark it as connected device.SetConnected(true); } else { device = new Device(handle, guid, is_xinput, is_xinput ? xinput_device_count++ : 0); // This is a new device, query its capabilities and add it // to the device list if (!QueryDeviceCaps(device) && !is_xinput) { continue; } device.SetConnected(true); // Check if a disconnected device with identical GUID already exists. // If so, replace that device with this instance. Device match = null; foreach (Device candidate in Devices) { if (candidate.GetGuid() == guid && !candidate.GetCapabilities().IsConnected) { match = candidate; } } if (match != null) { Devices.Remove(match.Handle.ToInt64()); } Devices.Add(hardware_id, device); Debug.Print("[{0}] Connected joystick {1} ({2})", GetType().Name, device.GetGuid(), device.GetCapabilities()); } } }