Я пытаюсь прочитать данные из HID Reader с определенным идентификатором поставщика и идентификатором продукта в фоновой службе .net C#. Я смог успешно зарегистрировать устройство, но не смог прочитать считывающее устройство при считывании карты. Похоже, что ProcessRawInput никогда не вызывается.
Читатель эмулирует клавиатуру. Так что я могу провести карту и прочитать номер карты в блокноте. Итак, ридер и карта работают. Вот мой код.
Я пытаюсь прочитать данные из HID Reader с определенным идентификатором поставщика и идентификатором продукта в фоновой службе .net C#. Я смог успешно зарегистрировать устройство, но не смог прочитать считывающее устройство при считывании карты. Похоже, что ProcessRawInput никогда не вызывается. Читатель эмулирует клавиатуру. Так что я могу провести карту и прочитать номер карты в блокноте. Итак, ридер и карта работают. Вот мой код. [code]namespace HIDReaderService { public class Worker : BackgroundService { private readonly ILogger _logger; private IntPtr _messageOnlyWindowHandle = IntPtr.Zero; private const ushort VENDOR_ID = 0xFFFF; //input vendor id of attached keyboard/reader private const ushort PRODUCT_ID = 0xFF; //input product id of attached keyboard/reader
_windowProcDelegate = new WindowProcDelegate(WindowProc); _messageOnlyWindowHandle = CreateMessageOnlyWindow(); if (_messageOnlyWindowHandle == IntPtr.Zero) { _logger.LogError("Failed to create message-only window."); return; } else { _logger.LogInformation("Message-only window created successfully."); }
// Register the HID devices if (!RegisterHIDDevice(_messageOnlyWindowHandle)) { _logger.LogError("Failed to register HID device."); return; }
_logger.LogInformation("Listening for HID device input...");
var messageLoopThread = new Thread(MessageLoop); messageLoopThread.Start();
while (!stoppingToken.IsCancellationRequested) { await Task.Delay(100); } } // Define a delegate matching the signature of the window procedure private delegate IntPtr WndProcDelegate(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
// Update CreateMessageOnlyWindow method private IntPtr CreateMessageOnlyWindow() { // Create a delegate instance for the Window Procedure WndProcDelegate wndProcDelegate = new WndProcDelegate(WindowProc);
// Define and register the window class var wndClass = new WNDCLASS { // Convert delegate to function pointer lpfnWndProc = Marshal.GetFunctionPointerForDelegate(wndProcDelegate), hInstance = Marshal.GetHINSTANCE(typeof(Program).Module), lpszClassName = "MessageOnlyWindow" };
ushort classAtom = RegisterClass(ref wndClass); if (classAtom == 0) { int error = Marshal.GetLastWin32Error(); _logger.LogError($"Failed to register window class. Error: {error}"); return IntPtr.Zero; }
if (hWnd == IntPtr.Zero) { int error = Marshal.GetLastWin32Error(); _logger.LogError($"Failed to create message-only window. Error: {error}"); return IntPtr.Zero; }
_logger.LogInformation("Message-only window created successfully."); RegisterHIDDevice(hWnd); return hWnd; }
// Window Procedure method private IntPtr WindowProc(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam) { // Log every message that arrives in WindowProc to confirm message reception _logger.LogInformation($"WindowProc received message: {msg}");
// Check if we received the expected WM_INPUT message if (msg == WM_INPUT) { _logger.LogInformation("WM_INPUT message received."); ProcessRawInput(lParam); }
[DllImport("user32.dll")] private static extern IntPtr CreateWindowEx(int exStyle, string lpClassName, string lpWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, IntPtr hMenu, IntPtr hInstance, IntPtr lpParam);
[StructLayout(LayoutKind.Sequential)] private struct WNDCLASS { public int style; public IntPtr lpfnWndProc; public int cbClsExtra; public int cbWndExtra; public IntPtr hInstance; public IntPtr hIcon; public IntPtr hCursor; public IntPtr hbrBackground; public string lpszMenuName; public string lpszClassName; }
[StructLayout(LayoutKind.Sequential)] private struct MSG { public IntPtr hWnd; public uint message; public IntPtr wParam; public IntPtr lParam; public uint time; public POINT pt; }
[StructLayout(LayoutKind.Sequential)] private struct POINT { public int x; public int y; }
[StructLayout(LayoutKind.Sequential)] private struct RAWINPUTHEADER { public uint dwType; public uint dwSize; public IntPtr hDevice; public IntPtr wParam; }
[StructLayout(LayoutKind.Explicit)] private struct RAWINPUT { [FieldOffset(0)] public RAWINPUTHEADER header; [FieldOffset(16)] public RAWKEYBOARD keyboard; }
[StructLayout(LayoutKind.Sequential)] private struct RAWKEYBOARD { public ushort MakeCode; public ushort Flags; public ushort Reserved; public ushort VKey; public uint Message; public uint ExtraInformation; }
[StructLayout(LayoutKind.Sequential)] public struct RAWINPUTDEVICE { public ushort UsagePage; public ushort Usage; public int Flags; public IntPtr Target; } } } [/code] В целях тестирования можно использовать идентификатор продукта любого производителя подключенной клавиатуры.
Я пытаюсь прочитать данные из HID Reader с определенным идентификатором поставщика и идентификатором продукта в фоновой службе .NET 8/C#. Я смог успешно зарегистрировать устройство, но не смог прочитать считывающее устройство при считывании карты....
Я пытаюсь прочитать данные из HID Reader с определенным идентификатором поставщика и идентификатором продукта в фоновой службе .NET 8/C#. Я смог успешно зарегистрировать устройство, но не смог прочитать считывающее устройство при считывании карты....
У меня есть фоновая служба, которая выполняет некоторые задачи и задания в долго выполняющемся потоке. Для простоты мы будем рассматривать это как планировщик, который выполняет асинхронный вызов SQL и повторяет его. Теперь я использую AsyncLocal...
У меня есть приложение для Android, которое использует KTOR для выполнения HTTP -запросов. За пределами работника запрос работает как ожидалось, но когда я звоню в запрос внутри работника, они всегда время ожидают:...