private static unsafe bool RegisterRawDevice(ushort usagePage, ushort usage, uint flags) { RAWINPUTDEVICE rawDevice; rawDevice.usUsagePage = usagePage; rawDevice.usUsage = usage; rawDevice.dwFlags = flags; if ((flags & Win32.RIDEV_REMOVE) != Win32.RIDEV_REMOVE) { if (messageOnlyWindow == null) { messageOnlyWindow = new MessageOnlyWindow(); } rawDevice.hwndTarget = messageOnlyWindow.Handle; } else { rawDevice.hwndTarget = IntPtr.Zero; // Must be IntPtr.Zero if RIDEV_REMOVE is set. } bool registered = Win32.RegisterRawInputDevices((IntPtr)(&rawDevice), 1U, Win32.SIZEOF_RAWINPUTDEVICE); #if DEBUG if (!registered) { throw new Win32Exception(Marshal.GetLastWin32Error()); } #endif // DEBUG uint numDevices = unchecked ((uint)-1); // UInt32.MaxValue. uint res = Win32.GetRegisteredRawInputDevices(IntPtr.Zero, ref numDevices, Win32.SIZEOF_RAWINPUTDEVICE); #if DEBUG if (res != 0) { throw new Win32Exception(Marshal.GetLastWin32Error()); } #endif // DEBUG if (numDevices == 0) { if (messageOnlyWindow != null) { messageOnlyWindow.Dispose(); messageOnlyWindow = null; } } return(registered); }
public void SendingMessages() { var messagePump = new MessageOnlyWindow(); var messageList = new List <WindowMessage> (); var loopHasStarted = new ManualResetEventSlim(false); // ReSharper disable once InconsistentNaming const uint WM_APP = 0x8000; messagePump.MessageReceived += message => { lock (messageList) { messageList.Add(message); } loopHasStarted.Set(); return(IntPtr.Zero); }; bool loopHasStopped = false; Task.Factory.StartNew(() => { messagePump.StartMessageLoop(); loopHasStopped = true; }); Thread.Sleep(1000); SendMessage(messagePump.WindowHandle, WM_APP, UIntPtr.Zero, IntPtr.Zero); var result = loopHasStarted.Wait(5000); Assert.AreNotEqual(result, false, "Timeout: a message hasn't arrived."); SendMessage(messagePump.WindowHandle, WM_APP + 1, UIntPtr.Zero, IntPtr.Zero); SendMessage(messagePump.WindowHandle, WM_APP + 2, UIntPtr.Zero, IntPtr.Zero); Assert.AreNotEqual(loopHasStopped, true, "The message loop should not be stopped until we call StopMessageLoop()."); messagePump.StopMessageLoop(); Thread.Sleep(3000); Assert.AreEqual(loopHasStopped, true, "The message loop should be stopped since we have called StopMessageLoop()."); var numberOfAppMessages = messageList.Count( message => message.Message == WM_APP || message.Message == WM_APP + 1 || message.Message == WM_APP + 2); Assert.AreEqual(numberOfAppMessages, 3, "There should be three WM_APP + x messages in the list."); }
static RawInputService() { messageOnlyWindow = new MessageOnlyWindow(); var deviceFlags = DeviceFlags.InputSink; // DeviceNotify is not supported in Win XP (https://msdn.microsoft.com/de-de/library/windows/desktop/ms645565%28v=vs.85%29.aspx) if (Environment.OSVersion.IsWinVistaOrHigher()) { deviceFlags |= DeviceFlags.DeviceNotify; } Device.RegisterDevice(UsagePage.Generic, UsageId.GenericKeyboard, deviceFlags, messageOnlyWindow.Handle, RegisterDeviceOptions.NoFiltering); Device.RegisterDevice(UsagePage.Generic, UsageId.GenericMouse, deviceFlags, messageOnlyWindow.Handle, RegisterDeviceOptions.NoFiltering); }
static RawInputService() { messageOnlyWindow = new MessageOnlyWindow(); messageOnlyWindow.OnWndProc += (sender, m) => { switch (m.Msg) { case (int)WM.INPUT: Device.HandleMessage(m.LParam, m.HWnd); break; case (int)WM.INPUT_DEVICE_CHANGE: EnumerateDevices(); break; } }; const DeviceFlags deviceFlags = DeviceFlags.InputSink | DeviceFlags.DeviceNotify; Device.RegisterDevice(UsagePage.Generic, UsageId.GenericKeyboard, deviceFlags, messageOnlyWindow.Handle, RegisterDeviceOptions.NoFiltering); Device.RegisterDevice(UsagePage.Generic, UsageId.GenericMouse, deviceFlags, messageOnlyWindow.Handle, RegisterDeviceOptions.NoFiltering); }
private static unsafe bool RegisterRawDevice(ushort usagePage, ushort usage, uint flags) { RAWINPUTDEVICE rawDevice; rawDevice.usUsagePage = usagePage; rawDevice.usUsage = usage; rawDevice.dwFlags = flags; if ((flags & Win32.RIDEV_REMOVE) != Win32.RIDEV_REMOVE) { if (messageOnlyWindow == null) messageOnlyWindow = new MessageOnlyWindow(); rawDevice.hwndTarget = messageOnlyWindow.Handle; } else { rawDevice.hwndTarget = IntPtr.Zero; // Must be IntPtr.Zero if RIDEV_REMOVE is set. } bool registered = Win32.RegisterRawInputDevices((IntPtr)(&rawDevice), 1U, Win32.SIZEOF_RAWINPUTDEVICE); #if DEBUG if (!registered) throw new Win32Exception(Marshal.GetLastWin32Error()); #endif // DEBUG uint numDevices = unchecked((uint)-1); // UInt32.MaxValue. uint res = Win32.GetRegisteredRawInputDevices(IntPtr.Zero, ref numDevices, Win32.SIZEOF_RAWINPUTDEVICE); #if DEBUG if (res != 0) throw new Win32Exception(Marshal.GetLastWin32Error()); #endif // DEBUG if (numDevices == 0) { if (messageOnlyWindow != null) { messageOnlyWindow.Dispose(); messageOnlyWindow = null; } } return registered; }
static RawInputService() { messageOnlyWindow = new MessageOnlyWindow(); Device.RegisterDevice(UsagePage.Generic, UsageId.GenericKeyboard, DeviceFlags.InputSink | DeviceFlags.DeviceNotify, messageOnlyWindow.Handle, RegisterDeviceOptions.NoFiltering); Device.RegisterDevice(UsagePage.Generic, UsageId.GenericMouse, DeviceFlags.InputSink | DeviceFlags.DeviceNotify, messageOnlyWindow.Handle, RegisterDeviceOptions.NoFiltering); }