Example #1
0
        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.");
        }
Example #3
0
        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);
        }
Example #4
0
        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;
        }
Example #6
0
 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);
 }