RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 912284
Accepted
Liidia
Liidia
Asked:2020-11-27 22:10:54 +0000 UTC2020-11-27 22:10:54 +0000 UTC 2020-11-27 22:10:54 +0000 UTC

如何访问二维码扫描端口?

  • 772

我有一个通过 USB 连接的二维码扫描仪。自然,它的供应商 ID 和产品 ID 是已知的。有了这些数据,如何识别要监听的端口?我尝试使用 LibUsbDotNet 库,但我不知道如何使用它。我可以通过以下方式获得有关已连接键盘的信息,但我完全不知道下一步该做什么。

ManagementObjectSearcher searcher =
                              new ManagementObjectSearcher("root\\CIMV2",
                              "SELECT * FROM Win32_Keyboard");
            ManagementObjectCollection keyboards = searcher.Get();

            foreach (ManagementObject queryObj in keyboards)
            {
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("Win32_Keyboard instance");
                Console.WriteLine("-----------------------------------");
                Console.WriteLine("Availability: {0}", queryObj["Availability"]);
                Console.WriteLine("Caption: {0}", queryObj["Caption"]);
                Console.WriteLine("ConfigManagerErrorCode: {0}", queryObj["ConfigManagerErrorCode"]);
                Console.WriteLine("ConfigManagerUserConfig: {0}", queryObj["ConfigManagerUserConfig"]);
                Console.WriteLine("CreationClassName: {0}", queryObj["CreationClassName"]);
                Console.WriteLine("Description: {0}", queryObj["Description"]);
                Console.WriteLine("DeviceID: {0}", queryObj["DeviceID"]);
                Console.WriteLine("ErrorCleared: {0}", queryObj["ErrorCleared"]);
                Console.WriteLine("ErrorDescription: {0}", queryObj["ErrorDescription"]);
                Console.WriteLine("InstallDate: {0}", queryObj["InstallDate"]);
                Console.WriteLine("IsLocked: {0}", queryObj["IsLocked"]);
                Console.WriteLine("LastErrorCode: {0}", queryObj["LastErrorCode"]);
                Console.WriteLine("Layout: {0}", queryObj["Layout"]);
                Console.WriteLine("Name: {0}", queryObj["Name"]);
                Console.WriteLine("NumberOfFunctionKeys: {0}", queryObj["NumberOfFunctionKeys"]);
                Console.WriteLine("Password: {0}", queryObj["Password"]);
                Console.WriteLine("PNPDeviceID: {0}", queryObj["PNPDeviceID"]);

                if (queryObj["PowerManagementCapabilities"] == null)
                    Console.WriteLine("PowerManagementCapabilities: {0}", queryObj["PowerManagementCapabilities"]);
                else
                {
                    UInt16[] arrPowerManagementCapabilities = (UInt16[])(queryObj["PowerManagementCapabilities"]);
                    foreach (UInt16 arrValue in arrPowerManagementCapabilities)
                    {
                        Console.WriteLine("PowerManagementCapabilities: {0}", arrValue);
                    }
                }
                Console.WriteLine("PowerManagementSupported: {0}", queryObj["PowerManagementSupported"]);
                Console.WriteLine("Status: {0}", queryObj["Status"]);
                Console.WriteLine("StatusInfo: {0}", queryObj["StatusInfo"]);
                Console.WriteLine("SystemCreationClassName: {0}", queryObj["SystemCreationClassName"]);
                Console.WriteLine("SystemName: {0}", queryObj["SystemName"]);
            }

            Console.ReadKey();
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    MSDN.WhiteKnight
    2020-11-28T14:31:55Z2020-11-28T14:31:55Z

    对于在键盘模拟模式下运行的扫描仪,将输入与特定设备隔离的唯一方法是使用Raw Input。

    例子:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows;
    using System.Runtime.InteropServices;
    using System.Windows.Interop;
    
    namespace WpfApp1
    {
        public partial class MainWindow : Window
        {        
            //обработчик сообщений для окна
            private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
            {
    
                if (msg == Keyboard.WM_INPUT)
                {
                    RAWINPUT data;
                    int size = Marshal.SizeOf(typeof(RAWINPUT));
                    Keyboard.GetRawInputData(lParam, Keyboard.RID_INPUT, out data, ref size,
                        Marshal.SizeOf(typeof(RAWINPUTHEADER)));
    
                    if (data.Header.Type == Keyboard.RawInputType_Keyboard)
                    {                   
                        //выведем нажатую клавишу
                        textbox.Text += "["+Keyboard.VKCodeToUnicode((uint)data.Keyboard.VirtualKey)+"]";                    
    
                        //выведем тип события
                        switch (data.Keyboard.Message)
                        {
                            case Keyboard.WM_KEYDOWN:
                                textbox.Text += " pressed";
                                break;
                            case Keyboard.WM_KEYUP:
                                textbox.Text += " released";
                                break;
                        }                    
                        textbox.Text += Environment.NewLine;
    
                        //выведем устройство-источник
                        StringBuilder sb = new StringBuilder(500);
                        uint strsize = (uint)sb.Capacity * 2;
                        uint result = Keyboard.GetRawInputDeviceInfo(data.Header.Device, Keyboard.RIDI_DEVICENAME, sb, ref strsize);
                        textbox.Text += "Source device: "+sb.ToString();
                        textbox.Text += Environment.NewLine;
                        textbox.Text += Environment.NewLine;
    
                    }                  
                }
    
                return IntPtr.Zero;
            }
    
            public MainWindow()
            {
                InitializeComponent();
            }
    
            private void ButtonRegister_Click(object sender, RoutedEventArgs e)
            {
                //регистрируем обработчик сообщений
                WindowInteropHelper h = new WindowInteropHelper(this);
                HwndSource source = HwndSource.FromHwnd(h.Handle);
                source.AddHook(new HwndSourceHook(WndProc));
    
                //регистрируем окно в Raw Input
                RAWINPUTDEVICE[] rid = new RAWINPUTDEVICE[1];
                rid[0].UsagePage = Keyboard.HidPage_Generic;
                rid[0].Usage = Keyboard.HidUsage_Keyboard;
                rid[0].WindowHandle = h.Handle;
    
                bool res = Keyboard.RegisterRawInputDevices(rid, 1, Marshal.SizeOf(typeof(RAWINPUTDEVICE)));
                if (res == false) MessageBox.Show("RegisterRawInputDevices failed");
            }
        }
    
        // Вспомогательный класс для работы с клавиатурой
        public class Keyboard
        {
            public const uint VK_CAPITAL = 0x14;
            public const uint WM_INPUT = 0x00FF;
            public const uint WM_KEYDOWN = 0x0100;
            public const uint WM_KEYUP = 0x0101;
            public const uint RID_INPUT = 0x10000003;
            public const uint RIDI_DEVICENAME = 0x20000007;
            public const uint RawInputType_Keyboard = 1;
            public const ushort HidPage_Generic = 0x01;
            public const ushort HidUsage_Keyboard = 0x06;
    
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
            public static extern uint GetRawInputDeviceList
            (
                [In, Out] RAWINPUTDEVICELIST[] RawInputDeviceList,
                ref uint NumDevices,
                uint Size
            );
    
            [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
            public static extern uint GetRawInputDeviceInfo(
                IntPtr hDevice,
                uint uiCommand,
                [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pData,
                ref uint pcbSize);
    
            [DllImport("user32.dll")]
            public static extern int GetRawInputData(IntPtr hRawInput, uint uiCommand, out RAWINPUT pData, ref int pcbSize, int cbSizeHeader);
    
            [DllImport("user32.dll")]
            public static extern bool RegisterRawInputDevices([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)]
            RAWINPUTDEVICE[] pRawInputDevices, int uiNumDevices, int cbSize);
    
            [DllImport("USER32.dll")]
            public static extern short GetKeyState(int vKey);
    
            [DllImport("user32.dll")]
            public static extern short GetAsyncKeyState(int vKey);
    
            [DllImport("user32.dll")]
            public static extern int ToUnicodeEx(
                uint wVirtKey,
                uint wScanCode,
                byte[] lpKeyState,
                [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff,
                int cchBuff,
                uint wFlags,
                IntPtr dwhkl);
    
            [DllImport("user32.dll")]
            public static extern bool GetKeyboardState(byte[] lpKeyState);
    
            [DllImport("user32.dll")]
            public static extern uint MapVirtualKey(
                uint uCode,
                uint uMapType);
    
            [DllImport("user32.dll")]
            public static extern IntPtr GetKeyboardLayout(uint idThread);
    
            [DllImport("user32.dll")]
            public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
    
            [DllImport("user32.dll")]
            public static extern IntPtr GetForegroundWindow();
    
            //преобразование кода клавиши в символы
            public static string VKCodeToUnicode(uint vkCode)
            {
                StringBuilder buf = new StringBuilder();
    
                byte[] keyboardState = new byte[255];
    
                short x;
                byte y;
    
                for (int i = 0; i < 255; i++)
                {
                    if (i == VK_CAPITAL)
                    {
                        x = GetKeyState(i);
                    }
                    else
                    {
                        x = GetAsyncKeyState(i);
                    }
                    y = 0;
                    if ((x & 0x8000) != 0) y = (byte)(y | 0x80);
                    if ((x & 0x0001) != 0) y = (byte)(y | 0x01);
                    keyboardState[i] = y;
                }
    
                ToUnicodeEx(vkCode, MapVirtualKey(vkCode, 0), keyboardState, buf, 5, 0,
                    GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero)));
                return buf.ToString();
            }
    
        }
    
        // Структуры
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RAWINPUTDEVICELIST
        {
            public IntPtr hDevice;
            public uint Type;
        }
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RAWINPUTDEVICE
        {
            /// <summary>Top level collection Usage page for the raw input device.</summary>
            public ushort UsagePage;
            /// <summary>Top level collection Usage for the raw input device. </summary>
            public ushort Usage;
            /// <summary>Mode flag that specifies how to interpret the information provided by UsagePage and Usage.</summary>
            public uint Flags;
            /// <summary>Handle to the target device. If NULL, it follows the keyboard focus.</summary>
            public IntPtr WindowHandle;
        }  
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RAWINPUTHEADER
        {
            /// <summary>Type of device the input is coming from.</summary>
            public uint Type;
            /// <summary>Size of the packet of data.</summary>
            public int Size;
            /// <summary>Handle to the device sending the data.</summary>
            public IntPtr Device;
            /// <summary>wParam from the window message.</summary>
            public IntPtr wParam;
        }   
    
    
        [StructLayout(LayoutKind.Sequential)]
        public struct RAWINPUTKEYBOARD
        {
            /// <summary>Scan code for key depression.</summary>
            public short MakeCode;
            /// <summary>Scan code information.</summary>
            public ushort Flags;
            /// <summary>Reserved.</summary>
            public short Reserved;
            /// <summary>Virtual key code.</summary>
            public ushort VirtualKey;
            /// <summary>Corresponding window message.</summary>
            public uint Message;
            /// <summary>Extra information.</summary>
            public int ExtraInformation;
        }
    
        [StructLayout(LayoutKind.Explicit)]
        public struct RAWINPUT
        {
            /// <summary>Header for the data.</summary>
            [FieldOffset(0)]
            public RAWINPUTHEADER Header;      
    
            [FieldOffset(16)]
            public RAWINPUTKEYBOARD Keyboard;        
    
        }    
    }
    

    注意:代码是为 32 位应用程序量身定制的。

    在这种情况下,设备名称将如下所示\\?\ACPI#PNP0303#0#{884b96c3-56ef-11d1-bc8c-00a0c91405dd}。\\?\您对和之间的部分感兴趣{...},这是一个稍作修改的设备实例 ID(WMI 中的 PnpDeviceID)。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5