1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
1

Список подключенных HID-устройств

22.05.2016, 23:33. Показов 4885. Ответов 6
Метки нет (Все метки)

Доброго времени суток.
Код
Более менее неактуальные вопросы
Кликните здесь для просмотра всего текста
Подскажите пожалуйста, как я могу получить список подключенных к USB устройств, хотелось бы всех, но в основном интересует класс HID, список носителей я получаю след. кодом.
C#
1
2
3
4
5
6
foreach (var dInfo in DriveInfo.GetDrives())
            {
                if (dInfo.IsReady && dInfo.DriveType == DriveType.Removable)
                    usbBox1.Items.Add(string.Format("{0} ({1})",
                        (string.IsNullOrEmpty(dInfo.VolumeLabel) ? "Съёмный диск" : dInfo.VolumeLabel),
                        dInfo.Name));
Подскажите как всё остальное выловить?

Добавлено через 51 минуту
В попытках гугления нашел библиотеку libusbdotnet, пытаюсь реализовать пример описанный на сайте, но вывода нет.
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using LibUsbDotNet;
using LibUsbDotNet.Info;
using LibUsbDotNet.Main;
using System.Collections.ObjectModel;
 
namespace Examples
{
    internal class ShowInfo
    {
        public static UsbDevice MyUsbDevice;
 
        public static void Main(string[] args)
        {
           
            // Dump all devices and descriptor information to console output.
            UsbRegDeviceList allDevices = UsbDevice.AllDevices;
            foreach (UsbRegistry usbRegistry in allDevices)
            {
                if (usbRegistry.Open(out MyUsbDevice))
                {
                    Console.WriteLine("WTF");
                    Console.WriteLine(MyUsbDevice.Info.ToString());
                    for (int iConfig = 0; iConfig < MyUsbDevice.Configs.Count; iConfig++)
                    {
                        UsbConfigInfo configInfo = MyUsbDevice.Configs[iConfig];
                        Console.WriteLine(configInfo.ToString());
 
                        ReadOnlyCollection<UsbInterfaceInfo> interfaceList = configInfo.InterfaceInfoList;
                        for (int iInterface = 0; iInterface < interfaceList.Count; iInterface++)
                        {
                            UsbInterfaceInfo interfaceInfo = interfaceList[iInterface];
                            Console.WriteLine(interfaceInfo.ToString());
 
                            ReadOnlyCollection<UsbEndpointInfo> endpointList = interfaceInfo.EndpointInfoList;
                            for (int iEndpoint = 0; iEndpoint < endpointList.Count; iEndpoint++)
                            {
                                Console.WriteLine(endpointList[iEndpoint].ToString());
                            }
                        }
                    }
                }
            }
 
 
            // Free usb resources.
            // This is necessary for libusb-1.0 and Linux compatibility.
            UsbDevice.Exit();
 
            // Wait for user input..
            Console.ReadKey();
        }
    }
}


Добавлено через 14 часов 34 минуты
Окей, решил задачу сам - использовав библиотеку HidSharp. Всплыл альтернативный вопрос, как отследить подключение нового USB устройства, нашёл некоторые варианты с WM_DEVICECHANGE, но как я понял таким образом можно отследить только флешки, как быть с HID? И как сразу же отключить новое подключённое устройство?

Добавлено через 2 часа 19 минут
Окей, нашёл возможное решение, поехали дальше. Проблема следующая - есть два исходника, использую их в новом пустом проекте - всё отрабатывает идеально. Засовываю в свой, ошибок нет, но
C#
1
2
if (nEventType == Dbt.DBT_DEVICEARRIVAL ||
                    nEventType == Dbt.DBT_DEVICEREMOVECOMPLETE)
Не срабатывает. Код приведён ниже, в чем проблема подскажите пожалуйста.


Код
Form1.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
 
 
 
namespace WindowsFormsApplication6
{
    public partial class Form1 : Form
    {
        private IntPtr m_hNotifyDevNode;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Guid hidGuid = new Guid("4d1e55b2-f16f-11cf-88cb-001111000030");
            Guid usbXpressGuid = new Guid("3c5e1462-5695-4e18-876b-f3f3d08aaf18");
            Guid cp210xGuid = new Guid("993f7832-6e2d-4a0f-b272-e2c78e74f93e");
            Guid newCP210xGuid = new Guid("a2a39220-39f4-4b88-aecb-3d86a35dc748");
 
            RegisterNotification(hidGuid);
        }
 
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            UnregisterNotification();
        }
 
        private void RegisterNotification(Guid guid)
        {
            Dbt.DEV_BROADCAST_DEVICEINTERFACE devIF = new Dbt.DEV_BROADCAST_DEVICEINTERFACE();
            IntPtr devIFBuffer;
 
            // Set to HID GUID
            devIF.dbcc_size = Marshal.SizeOf(devIF);
            devIF.dbcc_devicetype = Dbt.DBT_DEVTYP_DEVICEINTERFACE;
            devIF.dbcc_reserved = 0;
            devIF.dbcc_classguid = guid;
 
            // Allocate a buffer for DLL call
            devIFBuffer = Marshal.AllocHGlobal(devIF.dbcc_size);
 
            // Copy devIF to buffer
            Marshal.StructureToPtr(devIF, devIFBuffer, true);
 
            // Register for HID device notifications
            m_hNotifyDevNode = Dbt.RegisterDeviceNotification(this.Handle, devIFBuffer, Dbt.DEVICE_NOTIFY_WINDOW_HANDLE);
 
            // Copy buffer to devIF
            Marshal.PtrToStructure(devIFBuffer, devIF);
 
            // Free buffer
            Marshal.FreeHGlobal(devIFBuffer);
        }
 
        // Unregister HID device notification
        private void UnregisterNotification()
        {
            uint ret = Dbt.UnregisterDeviceNotification(m_hNotifyDevNode);
        }
 
        protected override void WndProc(ref Message m)
        {
            // Intercept the WM_DEVICECHANGE message
            if (m.Msg == Dbt.WM_DEVICECHANGE)
            {
                // Get the message event type
                int nEventType = m.WParam.ToInt32();
 
                // Check for devices being connected or disconnected
                if (nEventType == Dbt.DBT_DEVICEARRIVAL ||
                    nEventType == Dbt.DBT_DEVICEREMOVECOMPLETE)
                {
                    Dbt.DEV_BROADCAST_HDR hdr = new Dbt.DEV_BROADCAST_HDR();
 
                    // Convert lparam to DEV_BROADCAST_HDR structure
                    Marshal.PtrToStructure(m.LParam, hdr);
 
                    if (hdr.dbch_devicetype == Dbt.DBT_DEVTYP_DEVICEINTERFACE)
                    {
                        Dbt.DEV_BROADCAST_DEVICEINTERFACE_1 devIF = new Dbt.DEV_BROADCAST_DEVICEINTERFACE_1();
 
                        // Convert lparam to DEV_BROADCAST_DEVICEINTERFACE structure
                        Marshal.PtrToStructure(m.LParam, devIF);
 
                        // Get the device path from the broadcast message
                        string devicePath = new string(devIF.dbcc_name);
 
                        // Remove null-terminated data from the string
                        int pos = devicePath.IndexOf((char)0);
                        if (pos != -1)
                        {
                            devicePath = devicePath.Substring(0, pos);
                        }
 
                        // An HID device was connected or removed
                        if (nEventType == Dbt.DBT_DEVICEREMOVECOMPLETE)
                        {
                            MessageBox.Show("Device "" + devicePath + "" was removed");
                        }
                        else if (nEventType == Dbt.DBT_DEVICEARRIVAL)
                        {
                            MessageBox.Show("Device "" + devicePath + "" arrived");
                        }
                    }
                }
            }
            base.WndProc(ref m);
        }
    }
}


Код
Dbt.cs
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
 
class Dbt
{
    #region Dbt Class - Constants
 
    public const ushort WM_DEVICECHANGE = 0x0219;
    public const ushort DBT_DEVICEARRIVAL = 0x8000;
    public const ushort DBT_DEVICEREMOVECOMPLETE = 0x8004;
    public const ushort DBT_DEVTYP_DEVICEINTERFACE = 0x0005;
    public const int DEVICE_NOTIFY_WINDOW_HANDLE = 0x0000;
 
    #endregion
 
    #region Dbt Class - Device Change Structures
 
    [StructLayout(LayoutKind.Sequential)]
    public class DEV_BROADCAST_DEVICEINTERFACE
    {
        public int dbcc_size;
        public int dbcc_devicetype;
        public int dbcc_reserved;
        public Guid dbcc_classguid;
        public char dbcc_name;
    }
 
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public class DEV_BROADCAST_DEVICEINTERFACE_1
    {
        public int dbcc_size;
        public int dbcc_devicetype;
        public int dbcc_reserved;
        public Guid dbcc_classguid;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
        public char[] dbcc_name;
    }
 
    [StructLayout(LayoutKind.Sequential)]
    public class DEV_BROADCAST_HDR
    {
        public int dbch_size;
        public int dbch_devicetype;
        public int dbch_reserved;
    }
 
    #endregion
 
    #region DLL Imports
 
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    public static extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr NotificationFilter, uint Flags);
 
    [DllImport("user32.dll")]
    public static extern uint UnregisterDeviceNotification(IntPtr Handle);
    
    #endregion
}


Добавлено через 6 минут
Проблема в том, что в новом проекте nEventType принимает значения 32768,32772 в зависимости от подключения/отключения, а в моём по неясным причинам всегда 7. Отключал библиотеки сторонние, результат неизменен.

Добавлено через 58 минут
В общем проблема решилась только созданием нового проекта.[/OFF]


Парюсь уже 4 часа 46 минут
Подскажите хотя-бы как сразу же отключить новое устройство после получения WM_DEVICECHANGE? Тут уж сам найти не могу.

Добавлено через 40 минут
Эхх, сплошной игнор, неужели никто помочь не может?
Подскажите как использовать DiUninstallDevice в шарпе?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2016, 23:33
Ответы с готовыми решениями:

Мониторинг подключенных устройств
всем добрый день :good: хочу написать (или хотя бы попробовать) программу, которая бы вела логи...

Как получить имена всех устройств подключённых к COM портам?
Как получить имена всех устройств подключённых к COM портам?

Вывести список локально подключенных компьютеров и информацию о них
всем привет. как мне осуществить чтобы выводил мне на форму список комп - ов и информацию об...

Список устройств и передача файла Bluetooth на C#
Доброго всем форумчанинам, Вот ситуация, необходимо реализовать на одной форме два поля (панели)...

6
Эксперт .NET
8880 / 5659 / 1347
Регистрация: 25.05.2015
Сообщений: 17,188
Записей в блоге: 14
23.05.2016, 06:17 2
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using ServiceApplication.Core;
 
namespace App
{
    public partial class DeviceChangeNotifier : UserControl
    {
        private const int WM_DEVICECHANGE = 0x0219;
        private const int DBT_DEVICEARRIVAL = 0x8000;
        private const int DBT_DEVICEREMOVEPENDING = 0x8003;
        private const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
        private const int DBT_CONFIGCHANGED = 0x0018;
 
        private Timer mUpdateTimer;
        public event EventHandler OnDeviceChange;
        
        public DeviceChangeNotifier()
        {
            InitializeComponent();
            this.Size = new Size(1, 1);
 
            Win32.RegisterForUsbEvents(this.Handle);
 
            this.mUpdateTimer = new Timer();
            this.mUpdateTimer.Interval = 5000;
            this.mUpdateTimer.Tick += new EventHandler(mUpdateTimer_Tick);
        }
 
        private void BeforeDisposing()
        {
            Win32.UnregisterForUsbEvents(this.Handle);
            this.mUpdateTimer.Stop();
            this.mUpdateTimer.Dispose();
        }
 
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_DEVICECHANGE)
            {
                if (((int)m.WParam == DBT_DEVICEARRIVAL) ||
                    ((int)m.WParam == DBT_DEVICEREMOVECOMPLETE) ||
                    ((int)m.WParam == DBT_DEVICEREMOVEPENDING) ||
                    ((int)m.WParam == DBT_CONFIGCHANGED))
                {
                    this.mUpdateTimer.Stop();
                    if (this.Visible)
                        this.mUpdateTimer.Start();
                }
            }
            base.WndProc(ref m);
        }
 
        private void mUpdateTimer_Tick(object sender, EventArgs e)
        {
            this.mUpdateTimer.Stop();
            if (this.OnDeviceChange != null)
                this.OnDeviceChange(this.OnDeviceChange, EventArgs.Empty);
        }
    }
}


Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
 
namespace App
{    
    public static class Win32: Object
    {
        public const int WM_DEVICECHANGE = 0x0219;
        public const int DEVICE_ARRIVAL = 0x8000;
        public const int DEVICE_REMOVECOMPLETE = 0x8004;
        private const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 0x4;
        private const int DEVTYP_DEVICEINTERFACE = 0x05;
 
        private const int DBT_DEVTYP_DEVICEINTERFACE = 0x00000005;
 
        private const int DBT_DEVTYP_HANDLE = 0x00000006;
 
        private const int DBT_DEVTYP_OEM = 0x00000000;
 
        private const int DBT_DEVTYP_PORT = 0x00000003;
 
        private const int DBT_DEVTYP_VOLUME = 0x00000002;
 
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
        public class DeviceBroadcastInterface
        {
            public int Size;
            public int DeviceType;
            public int Reserved;
            public Guid ClassGuid;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
            public string Name;
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct DEV_BROADCAST_HDR
        {
            public uint dbch_Size;
            public uint dbch_DeviceType;
            public uint dbch_Reserved;
        }
 
        [DllImport("user32.dll", SetLastError = true)]
        private static extern IntPtr RegisterDeviceNotification(IntPtr hwnd, DeviceBroadcastInterface oInterface, uint nFlags);
        [DllImport("user32.dll", SetLastError = true)]
        private static extern bool UnregisterDeviceNotification(IntPtr hHandle);
 
        public static IntPtr RegisterForUsbEvents(IntPtr hWnd)
        {
            var oInterfaceIn = new DeviceBroadcastInterface();
            oInterfaceIn.Size = Marshal.SizeOf(oInterfaceIn);
            oInterfaceIn.ClassGuid = Guid.Empty;
            oInterfaceIn.DeviceType = DEVTYP_DEVICEINTERFACE;
            oInterfaceIn.Reserved = 0;
            return RegisterDeviceNotification(hWnd, oInterfaceIn, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
        }
 
        public static bool UnregisterForUsbEvents(IntPtr hHandle)
        {
            return UnregisterDeviceNotification(hHandle);
        }
    }
}


Отсюда: A USB HID Component for C#

Насчёт отключения не знаю. Но сигнатуру можете посмотреть на pinvoke.net
1
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
23.05.2016, 10:44  [ТС] 3
Как использовать DiUninstallDevice так и не нашёл. Пришлось использовать альтернативу, запускаю Devcon и передаю в него Vid & Pid устройства с аргументом Remove, зато решилась проблема с выдиранием GUID конкретного устройства.
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
24.05.2016, 14:05  [ТС] 4
Опять поднимаю данную тему. Есть ли возможность средствами C# узнать модель контроллера USB-устройства?
0
Эксперт .NET
8880 / 5659 / 1347
Регистрация: 25.05.2015
Сообщений: 17,188
Записей в блоге: 14
24.05.2016, 14:16 5
А что Вы под этим контроллером понимаете?

Добавлено через 11 минут
Контроллер на плате ПК, отвечающий за USB?
Или контроллер, находящийся в подключённом по USB устройстве?
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
24.05.2016, 14:54  [ТС] 6
Контроллер в USB-устройстве.
0
Эксперт .NET
8880 / 5659 / 1347
Регистрация: 25.05.2015
Сообщений: 17,188
Записей в блоге: 14
24.05.2016, 15:17 7
ОС знает только то, что сообщено по протоколу. И в дескрипторах.
А с какой целью интересуетесь?)

Добавлено через 20 минут
Есть vid, pid, s/n, название производителя, прибора, его номер и кастомные строки.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.05.2016, 15:17
Помогаю со студенческими работами здесь

Как завести список подключенных устройств ?
Нужно сделать так что бы я мог приконектить 2 блутуза и мог к ним по очереди обращаться. Как это...

Получить список устройств, подключенных к USB
Доброго времени суток. Пытаюсь получить список устройств подключенных к USB import...

Получить список подключенных устройств по сети
Нужен список утройств и др компьютеров подключенных к моему по сети на подобии того что в &quot;Сетевом...

Список устройств, подключенных к точке доступа wifi
Нужно получить список устройств, подключенных к точке доступа. Не знаю даже как подступиться к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru