Example #1
0
        /// <summary>
        ///     Registers to be notified when devices are added or removed.
        /// </summary>
        /// <param name="register">True to register, False to unregister</param>
        /// <param name="f">Form</param>
        /// <returns>True if successfull, False otherwise</returns>
        public bool RegisterForDeviceChange(bool doRegister, Form f)
        {
            var  Status = false;
            long LastError;

            if (doRegister)
            {
                var deviceInterface = new Win32Wrapper.DEV_BROADCAST_DEVICEINTERFACE();
                int size            = Marshal.SizeOf(deviceInterface);
                deviceInterface.dbcc_size       = size;
                deviceInterface.dbcc_devicetype = (int)Win32Wrapper.DBTDEVTYP.DBT_DEVTYP_DEVICEINTERFACE;
                var buffer = default(IntPtr);
                buffer = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(deviceInterface, buffer, true);
                deviceEventHandle = Win32Wrapper.RegisterDeviceNotification(f.Handle, buffer,
                                                                            (int)(Win32Wrapper.DEVICE_NOTIFY.DEVICE_NOTIFY_WINDOW_HANDLE | Win32Wrapper.DEVICE_NOTIFY.DEVICE_NOTIFY_ALL_INTERFACE_CLASSES));
                Status = deviceEventHandle != IntPtr.Zero;
                if (!Status)
                {
                    LastError = Marshal.GetLastWin32Error();
                }
                Marshal.FreeHGlobal(buffer);
            }
            else
            {
                if (deviceEventHandle != IntPtr.Zero)
                {
                    Status = Win32Wrapper.UnregisterDeviceNotification(deviceEventHandle);
                }
                deviceEventHandle = IntPtr.Zero;
            }

            return(Status);
        }
Example #2
0
        /// <summary>
        /// Registers to be notified when devices are added or removed.
        /// </summary>
        /// <param name="register">True to register, False to unregister</param>
        /// <param name="f">Form</param>
        /// <returns>True if successfull, False otherwise</returns>
        public bool RegisterForDeviceChange(bool Register, System.Windows.Forms.Form f)
        {
            bool Status = false;
            long LastError;

            if (Register)
            {
                Win32Wrapper.DEV_BROADCAST_DEVICEINTERFACE deviceInterface = new Win32Wrapper.DEV_BROADCAST_DEVICEINTERFACE();
                int size = Marshal.SizeOf(deviceInterface);
                deviceInterface.dbcc_size = size;
                deviceInterface.dbcc_devicetype = (Int32)Win32Wrapper.DBTDEVTYP.DBT_DEVTYP_DEVICEINTERFACE;
                IntPtr buffer = default(IntPtr);
                buffer = Marshal.AllocHGlobal(size);
                Marshal.StructureToPtr(deviceInterface, buffer, true);
                deviceEventHandle = Win32Wrapper.RegisterDeviceNotification(f.Handle, buffer, (int)(Win32Wrapper.DEVICE_NOTIFY.DEVICE_NOTIFY_WINDOW_HANDLE | Win32Wrapper.DEVICE_NOTIFY.DEVICE_NOTIFY_ALL_INTERFACE_CLASSES));
                Status = (deviceEventHandle != IntPtr.Zero);
                if (!Status)
                {
                    LastError = Marshal.GetLastWin32Error();
                }
                Marshal.FreeHGlobal(buffer);
            }
            else
            {
                if (deviceEventHandle != IntPtr.Zero)
                {
                    Status = Win32Wrapper.UnregisterDeviceNotification(deviceEventHandle);
                }
                deviceEventHandle = IntPtr.Zero;
            }

            return Status;
        }
        public void RegisterForDeviceNotification(Form form)
        {
            UnregisterForDeviceNotification();

            // Register for WM_DEVICECHANGE notifications.  This code uses these messages to detect plug and play connection/disconnection events for USB devices
            Win32Wrapper.DEV_BROADCAST_DEVICEINTERFACE DeviceBroadcastHeader = new Win32Wrapper.DEV_BROADCAST_DEVICEINTERFACE();
            DeviceBroadcastHeader.dbcc_devicetype = Win32Wrapper.DBT_DEVTYP_DEVICEINTERFACE;
            DeviceBroadcastHeader.dbcc_size = (uint)Marshal.SizeOf(DeviceBroadcastHeader);
            DeviceBroadcastHeader.dbcc_reserved = 0;	//Reserved says not to use...
            DeviceBroadcastHeader.dbcc_classguid = Win32Wrapper.InterfaceClassGuid;

            // Need to get the address of the DeviceBroadcastHeader to call RegisterDeviceNotification(), but
            // can't use "&DeviceBroadcastHeader".  Instead, using a roundabout means to get the address by 
            // making a duplicate copy using Marshal.StructureToPtr().
            IntPtr pDeviceBroadcastHeader = IntPtr.Zero;  //Make a pointer.
            pDeviceBroadcastHeader = Marshal.AllocHGlobal(Marshal.SizeOf(DeviceBroadcastHeader)); //allocate memory for a new DEV_BROADCAST_DEVICEINTERFACE structure, and return the address 
            Marshal.StructureToPtr(DeviceBroadcastHeader, pDeviceBroadcastHeader, false);  //Copies the DeviceBroadcastHeader structure into the memory already allocated at DeviceBroadcastHeaderWithPointer
            DeviceEventHandle = Win32Wrapper.RegisterDeviceNotification(form.Handle, pDeviceBroadcastHeader, Win32Wrapper.DEVICE_NOTIFY_WINDOW_HANDLE);
        }