protected override void Run(Action readyCallback) { using (var manager = NativeMethods.IOHIDManagerCreate(IntPtr.Zero).ToCFType()) { RunAssert(manager.IsSet, "HidSharp IOHIDManagerCreate failed."); using (var matching = NativeMethods.IOServiceMatching("IOHIDDevice").ToCFType()) { RunAssert(matching.IsSet, "HidSharp IOServiceMatching failed."); var devicesChangedCallback = new NativeMethods.IOHIDDeviceCallback(DevicesChangedCallback); NativeMethods.IOHIDManagerSetDeviceMatching(manager.Handle, matching.Handle); NativeMethods.IOHIDManagerRegisterDeviceMatchingCallback(manager.Handle, devicesChangedCallback, IntPtr.Zero); NativeMethods.IOHIDManagerRegisterDeviceRemovalCallback(manager.Handle, devicesChangedCallback, IntPtr.Zero); var runLoop = NativeMethods.CFRunLoopGetCurrent(); NativeMethods.CFRetain(runLoop); NativeMethods.IOHIDManagerScheduleWithRunLoop(manager, runLoop, NativeMethods.kCFRunLoopDefaultMode); try { readyCallback(); NativeMethods.CFRunLoopRun(); } finally { NativeMethods.IOHIDManagerUnscheduleFromRunLoop(manager, runLoop, NativeMethods.kCFRunLoopDefaultMode); NativeMethods.CFRelease(runLoop); } GC.KeepAlive(devicesChangedCallback); } } }
public HIDInput() { Debug.Print("Using HIDInput."); HandleDeviceAdded = DeviceAdded; HandleDeviceRemoved = DeviceRemoved; HandleDeviceValueReceived = DeviceValueReceived; hidmanager = CreateHIDManager(); RegisterHIDCallbacks(hidmanager); }
public HIDInput() { Debug.Print("Using HIDInput."); HandleDeviceAdded = DeviceAdded; HandleDeviceRemoved = DeviceRemoved; HandleDeviceValueReceived = DeviceValueReceived; hidmanager = CreateHIDManager(); RegisterHIDCallbacks(hidmanager); }
void Dispose(bool manual) { if (!disposed) { if (manual) { NativeMethods.IOHIDManagerRegisterDeviceMatchingCallback( hidmanager, IntPtr.Zero, IntPtr.Zero); NativeMethods.IOHIDManagerRegisterDeviceRemovalCallback( hidmanager, IntPtr.Zero, IntPtr.Zero); NativeMethods.IOHIDManagerScheduleWithRunLoop( hidmanager, IntPtr.Zero, IntPtr.Zero); foreach (var device in MouseDevices.Keys) { NativeMethods.IOHIDDeviceRegisterInputValueCallback( device, IntPtr.Zero, IntPtr.Zero); } foreach (var device in KeyboardDevices.Keys) { NativeMethods.IOHIDDeviceRegisterInputValueCallback( device, IntPtr.Zero, IntPtr.Zero); } HandleDeviceAdded = null; HandleDeviceRemoved = null; HandleDeviceValueReceived = null; } else { Debug.Print("{0} leaked, did you forget to call Dispose()?", GetType()); } disposed = true; } }
void Dispose(bool manual) { if (!disposed) { if (manual) { NativeMethods.IOHIDManagerRegisterDeviceMatchingCallback( hidmanager, IntPtr.Zero, IntPtr.Zero); NativeMethods.IOHIDManagerRegisterDeviceRemovalCallback( hidmanager, IntPtr.Zero, IntPtr.Zero); NativeMethods.IOHIDManagerUnscheduleFromRunLoop( hidmanager, RunLoop, InputLoopMode); foreach (var device in MouseDevices.Keys) { DeviceRemoved(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, device); } foreach (var device in KeyboardDevices.Keys) { DeviceRemoved(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, device); } foreach (var device in JoystickDevices.Keys) { DeviceRemoved(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, device); } HandleDeviceAdded = null; HandleDeviceRemoved = null; HandleDeviceValueReceived = null; if (MouseEventTap != IntPtr.Zero) { CF.CFRelease(MouseEventTap); MouseEventTap = IntPtr.Zero; } if (MouseEventTapSource != IntPtr.Zero) { CF.CFRelease(MouseEventTapSource); MouseEventTapSource = IntPtr.Zero; } } else { Debug.Print("{0} leaked, did you forget to call Dispose()?", GetType()); } disposed = true; } }
public HIDInput() { Debug.Print("Using HIDInput."); HandleDeviceAdded = DeviceAdded; HandleDeviceRemoved = DeviceRemoved; HandleDeviceValueReceived = DeviceValueReceived; // For retrieving input directly from the hardware hidmanager = CreateHIDManager(); RegisterHIDCallbacks(hidmanager); // For retrieving the global cursor position RegisterMouseMonitor(); }
public HIDInput() { Debug.Print("Using HIDInput."); RunLoop = CF.CFRunLoopGetMain(); if (RunLoop == IntPtr.Zero) RunLoop = CF.CFRunLoopGetCurrent(); if (RunLoop == IntPtr.Zero) { Debug.Print("[Error] No CFRunLoop found for {0}", GetType().FullName); throw new InvalidOperationException(); } CF.CFRetain(RunLoop); HandleDeviceAdded = DeviceAdded; HandleDeviceRemoved = DeviceRemoved; HandleDeviceValueReceived = DeviceValueReceived; // For retrieving input directly from the hardware hidmanager = CreateHIDManager(); if (hidmanager == IntPtr.Zero) { Debug.Print("[Mac] Failed to create IO HID manager, HIDInput driver not supported."); throw new NotSupportedException(); } RegisterHIDCallbacks(hidmanager); // For retrieving the global cursor position RegisterMouseMonitor(); }
void Dispose(bool manual) { if (!disposed) { if (manual) { NativeMethods.IOHIDManagerRegisterDeviceMatchingCallback( hidmanager, IntPtr.Zero, IntPtr.Zero); NativeMethods.IOHIDManagerRegisterDeviceRemovalCallback( hidmanager, IntPtr.Zero, IntPtr.Zero); NativeMethods.IOHIDManagerScheduleWithRunLoop( hidmanager, IntPtr.Zero, IntPtr.Zero); foreach (var device in MouseDevices.Keys) { NativeMethods.IOHIDDeviceRegisterInputValueCallback( device, IntPtr.Zero, IntPtr.Zero); } foreach (var device in KeyboardDevices.Keys) { NativeMethods.IOHIDDeviceRegisterInputValueCallback( device, IntPtr.Zero, IntPtr.Zero); } HandleDeviceAdded = null; HandleDeviceRemoved = null; HandleDeviceValueReceived = null; } else { Debug.Print("{0} leaked, did you forget to call Dispose()?", GetType()); } disposed = true; } }