Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-04-2016
Delfino Delfino is offline
Miembro
 
Registrado: jul 2003
Ubicación: Madrid
Posts: 974
Poder: 21
Delfino Va por buen camino
Has mirado el componente TJvHidDeviceController de la suite JVCL?
__________________
¿Microsoft? No, gracias..
Responder Con Cita
  #2  
Antiguo 15-04-2016
Noiro Noiro is offline
Registrado
NULL
 
Registrado: abr 2016
Posts: 1
Poder: 0
Noiro Va por buen camino
Puedes utilizar RegisterRawInputDevices.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  USHORT = Word;
  HRAWINPUT = THandle;
  LPVOID = Pointer;

  tagRAWINPUTDEVICE = record
    usUsagePage: USHORT;
    usUsage: USHORT;
    dwFlags: DWORD;
    hwndTarget: HWND;
  end;
  RAWINPUTDEVICE = tagRAWINPUTDEVICE;
  TRawInputDevice = RAWINPUTDEVICE;
  PRawInputDevice = ^TRawInputDevice;
  LPRAWINPUTDEVICE = PRawInputDevice;
  PCRAWINPUTDEVICE = PRawInputDevice;

  tagRAWINPUTHEADER = record
    dwType: DWORD;
    dwSize: DWORD;
    hDevice: THandle;
    wParam: WPARAM;
  end;
  RAWINPUTHEADER = tagRAWINPUTHEADER;
  TRawInputHeader = RAWINPUTHEADER;
  PRawInputHeader = ^TRawInputHeader;

  tagRAWMOUSE = record
    usFlags: WORD;
    union: record
    case Integer of
      0: (
        ulButtons: ULONG);
      1: (
        usButtonFlags: WORD;
        usButtonData: WORD);
    end;
    ulRawButtons: ULONG;
    lLastX: LongInt;
    lLastY: LongInt;
    ulExtraInformation: ULONG;
  end;
  RAWMOUSE = tagRAWMOUSE;
  TRawMouse = RAWMOUSE;
  PRAWMOUSE = ^RAWMOUSE;
  LPRAWMOUSE = ^RAWMOUSE;

  tagRAWKEYBOARD = record
    MakeCode: USHORT;
    Flags: USHORT;
    Reserved: USHORT;
    VKey: USHORT;
    Message: UINT;
    ExtraInformation: ULONG;
  end;
  RAWKEYBOARD = tagRAWKEYBOARD;
  TRawKeyboard = RAWKEYBOARD;
  PRawKeyboard = ^TRawKeyboard;
  LPRAWKEYBOARD = PRawKeyboard;

  tagRAWHID = record
    dwSizeHid: DWORD;    // byte size of each report
    dwCount: DWORD;      // number of input packed
    bRawData: array [0..0] of BYTE;
  end;
  RAWHID = tagRAWHID;
  TRawHID = RAWHID;
  PRawHID = ^TRawHID;
  LPRAWHID = PRawHID;


  tagRAWINPUT = record
    header: TRawInputHeader;
    case Integer of
      0: (mouse: RAWMOUSE);
      1: (keyboard: RAWKEYBOARD);
      2: (hid: RAWHID);
  end;
  RAWINPUT = tagRAWINPUT;
  TRawInput = RAWINPUT;
  PRawInput = ^TRawInput;
  LPRAWINPUT = PRawInput;

  TForm1 = class(TForm)
  private
  protected
    procedure CreateWindowHandle(const Params: TCreateParams); override;
    procedure WMInput(var Message: TMessage); message WM_INPUT;
    { Private declarations }
  public
    { Public declarations }
    
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

const
  GenericDesktopControls: USHORT = 01;
  Keyboard: USHORT = 06;
  RIDEV_INPUTSINK = $00000100;

  RIM_INPUT = 0;
  RIM_INPUTSINK = 1;
  RID_INPUT = $10000003;

  RIM_TYPEMOUSE      = 0;
  RIM_TYPEKEYBOARD   = 1;
  RIM_TYPEHID        = 2;

  RI_KEY_MAKE = 0;
  RI_KEY_BREAK = 1;


function RegisterRawInputDevices(
  pRawInputDevices: PCRAWINPUTDEVICE;
  uiNumDevices: UINT;
  cbSize: UINT): BOOL; stdcall; external user32;

function GetRawInputData(
  hRawInput: HRAWINPUT;
  uiCommand: UINT;
  pData: LPVOID;
  var pcbSize: UINT;
  cbSizeHeader: UINT): UINT; stdcall; external user32;


{ TForm1 }

procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
var
  RID: TRawInputDevice;
begin
  inherited;

  RID.usUsagePage := GenericDesktopControls;
  RID.usUsage := Keyboard;
  RID.dwFlags := RIDEV_INPUTSINK;
  RID.hwndTarget := Handle;
  Win32Check(RegisterRawInputDevices(@RID, 1, SizeOf(RID)));
end;

procedure TForm1.WMInput(var Message: TMessage);
var
  Size: UINT;
  Data: array of Byte;
  RawKeyboard: TRawKeyboard;
  RawHID: TRawHID;
begin
  if (Message.WParam and $FF) in [RIM_INPUT, RIM_INPUTSINK] then
    inherited;

  if (GetRawInputData(Message.LParam, RID_INPUT, nil, Size,
      SizeOf(TRawInputHeader)) = 0) then begin
    SetLength(Data, Size);
    if (GetRawInputData(Message.LParam, RID_INPUT, Data, Size,
        SizeOf(TRawInputHeader)) <> UINT(-1)) then
    begin
      if (PRawInput(Data)^.header.dwType = RIM_TYPEKEYBOARD) then
      begin
        RawKeyboard := PRawInput(Data)^.keyboard;

        if (RawKeyboard.VKey = VK_CONTROL) then begin
          if RawKeyboard.Flags and RI_KEY_BREAK = RI_KEY_BREAK then
            Cursor := crDefault
          else
            Cursor := crSizeAll; // will call continously until key is released
        end;
        // might opt to reset the cursor regardless of pointer position...


        if (RawKeyboard.VKey = Ord('A')) then
        begin
          // ....
        end;
      end
      else if (PRawInput(Data)^.header.dwType = RIM_TYPEHID) then
      begin
        RawHID := PRawInput(Data).hid;
        // ....
      end;
    end;

  end;
end;

end.

Para poder "escuchar" el HID tendrás que registrarlo en la llamada RegisterRawInputDevices pasando un array con el total de dispositivos.
Responder Con Cita
  #3  
Antiguo 19-04-2016
petercat petercat is offline
Miembro
 
Registrado: feb 2012
Posts: 23
Poder: 0
petercat Va por buen camino
Identificar multiteclado HID-USB

Gracias a nuestro amigo Noiro he podido conseguir distinguir el dispositivo Teclado del dispositivo RFID, podria valer para distinguir un teclado de un lector de codigo de barras etc.
Tan solo al codigo que pego Noiro se le han cambiado algunos parametros y con ello nos da el resultado del teclado en el Label1 y el lector en el Label2.
Una vez conseguido esto definido cada una de las direcciones del dispositivo y podemos aislar el teclado del lector tanto en un edit como en un memo.
Pego el codigo por si alguno esta buscando una solucion parecida a la mia.
Gracias a todos
PD si es necesario cambiar el titulo: "Deshabiliar HID-USB" por el de "Identificar multiteclado HID-USB"

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  USHORT = Word;
  HRAWINPUT = THandle;
  LPVOID = Pointer;
  HANDLE = THandle;

  tagRAWINPUTDEVICE = record
    usUsagePage: USHORT;
    usUsage: USHORT;
    dwFlags: DWORD;
    hwndTarget: HWND;
  end;
  RAWINPUTDEVICE = tagRAWINPUTDEVICE;
  TRawInputDevice = RAWINPUTDEVICE;
  PRawInputDevice = ^TRawInputDevice;
  LPRAWINPUTDEVICE = PRawInputDevice;
  PCRAWINPUTDEVICE = PRawInputDevice;

  tagRAWINPUTHEADER = record
    dwType: DWORD;
    dwSize: DWORD;
    hDevice: THandle;
    wParam: WPARAM;
  end;
  RAWINPUTHEADER = tagRAWINPUTHEADER;
  TRawInputHeader = RAWINPUTHEADER;
  PRawInputHeader = ^TRawInputHeader;

  tagRAWMOUSE = record
    usFlags: WORD;
    union: record
    case Integer of
      0: (
        ulButtons: ULONG);
      1: (
        usButtonFlags: WORD;
        usButtonData: WORD);
    end;
    ulRawButtons: ULONG;
    lLastX: LongInt;
    lLastY: LongInt;
    ulExtraInformation: ULONG;
  end;
  RAWMOUSE = tagRAWMOUSE;
  TRawMouse = RAWMOUSE;
  PRAWMOUSE = ^RAWMOUSE;
  LPRAWMOUSE = ^RAWMOUSE;

  tagRAWKEYBOARD = record
    MakeCode: USHORT;
    Flags: USHORT;
    Reserved: USHORT;
    VKey: USHORT;
    Message: UINT;
    ExtraInformation: ULONG;
  end;
  RAWKEYBOARD = tagRAWKEYBOARD;
  TRawKeyboard = RAWKEYBOARD;
  PRawKeyboard = ^TRawKeyboard;
  LPRAWKEYBOARD = PRawKeyboard;

  tagRAWHID = record
    dwSizeHid: DWORD;    // byte size of each report
    dwCount: DWORD;      // number of input packed
    bRawData: array [0..0] of BYTE;
  end;
  RAWHID = tagRAWHID;
  TRawHID = RAWHID;
  PRawHID = ^TRawHID;
  LPRAWHID = PRawHID;


  tagRAWINPUT = record
    header: TRawInputHeader;
    case Integer of
      0: (mouse: RAWMOUSE);
      1: (keyboard: RAWKEYBOARD);
      2: (hid: RAWHID);
  end;
  RAWINPUT = tagRAWINPUT;
  TRawInput = RAWINPUT;
  PRawInput = ^TRawInput;
  LPRAWINPUT = PRawInput;

  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
  private
  protected
    procedure CreateWindowHandle(const Params: TCreateParams); override;
    procedure WMInput(var Message: TMessage); message WM_INPUT;
    { Private declarations }
  public
    { Public declarations }

  end;

var
    Form1: TForm1;
    KBName: array[0..1023] of AnsiChar;

implementation

{$R *.dfm}

const
  GenericDesktopControls: USHORT = 01;
  Keyboard: USHORT = 06;
  RIDEV_INPUTSINK = $00000100;

  RIM_INPUT = 0;
  RIM_INPUTSINK = 1;
  RID_INPUT = $10000003;

  RIDI_DEVICENAME = $20000007;
  RIDI_DEVICEINFO = $2000000b;
  RIDI_PREPARSEDDATA = $20000005;

  RIM_TYPEMOUSE      = 0;
  RIM_TYPEKEYBOARD   = 1;
  RIM_TYPEHID        = 2;

  RI_KEY_MAKE = 0;
  RI_KEY_BREAK = 1;


function RegisterRawInputDevices(
  pRawInputDevices: PCRAWINPUTDEVICE;
  uiNumDevices: UINT;
  cbSize: UINT): BOOL; stdcall; external user32;

function GetRawInputData(
  hRawInput: HRAWINPUT;
  uiCommand: UINT;
  pData: LPVOID;
  var pcbSize: UINT;
  cbSizeHeader: UINT): UINT; stdcall; external user32;

function GetRawInputDeviceInfoA(hDevice: THANDLE; uiCommand: UINT; pData: POINTER;
    var pcbSize: UINT): UINT; stdcall; external user32;


{ TForm1 }



procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
var
  RID: TRawInputDevice;
begin
  inherited;

  RID.usUsagePage := GenericDesktopControls;
  RID.usUsage := Keyboard;
  RID.dwFlags := RIDEV_INPUTSINK;
  RID.hwndTarget := Handle;
  Win32Check(RegisterRawInputDevices(@RID, 1, SizeOf(RID)));
end;


procedure TForm1.WMInput(var Message: TMessage);
var
  Size: UINT;
  Data: array of Byte;
  RawKeyboard: TRawKeyboard;
  RawHID: TRawHID;
  devName: array of Byte;
//lo pasamos al var general
 // KBName: array[0..1023] of AnsiChar;
  Key :Char;
begin
  if (Message.WParam and $FF) in [RIM_INPUT, RIM_INPUTSINK] then
    inherited;

  if (GetRawInputData(Message.LParam, RID_INPUT, nil, Size,
      SizeOf(TRawInputHeader)) = 0) then begin
    SetLength(Data, Size);
    if (GetRawInputData(Message.LParam, RID_INPUT, Data, Size,
        SizeOf(TRawInputHeader)) <> UINT(-1)) then
    begin
      if (PRawInput(Data)^.header.dwType = RIM_TYPEKEYBOARD) then
      begin
        RawKeyboard := PRawInput(Data)^.keyboard;

        if (RawKeyboard.VKey = VK_CONTROL) then begin
          if RawKeyboard.Flags and RI_KEY_BREAK = RI_KEY_BREAK then
            Cursor := crDefault
          else
            Cursor := crSizeAll; // will call continously until key is released
        end;
        // might opt to reset the cursor regardless of pointer position...

// Al pulsar la tecla 'A' nos devolvera en el Label1 en KBName nos dara
//la ruta de acceso a la instancia del dispositivo
        if (RawKeyboard.VKey = Ord('A')) then
        begin
          Size := 1024;
          if (GetRawInputDeviceInfoA(PRawInput(Data)^.header.hDevice, RIDI_DEVICENAME,
            @KBName, Size) <> UINT(-1)) then
          begin
          Label1.Caption := Ansistring(KBName);
          end;
          // ....
        end;

// Al pulsar la tecla '0' nos devolvera en el Label2 en KBName nos dara
//la ruta de acceso a la instancia del dispositivo
                if (RawKeyboard.VKey = Ord('0')) then
        begin
          Size := 1024;
          if (GetRawInputDeviceInfoA(PRawInput(Data)^.header.hDevice, RIDI_DEVICENAME,
            @KBName, Size) <> UINT(-1)) then
          begin
          Label2.Caption := Ansistring(KBName);
          end;
          // ....
        end;

      end
      else if (PRawInput(Data)^.header.dwType = RIM_TYPEHID) then
      begin
        RawHID := PRawInput(Data).hid;
        // ....
      end;
    end;

  end;
end;

end.

Última edición por petercat fecha: 19-04-2016 a las 18:01:12. Razón: Error en el codigo
Responder Con Cita
  #4  
Antiguo 27-06-2023
Alexandro Prado Alexandro Prado is offline
Registrado
 
Registrado: jun 2023
Posts: 1
Poder: 0
Alexandro Prado Va por buen camino
Post me podrias ayudar con este descubrimiento tuyo

Hola petercat, vengo de Brasil, tengo un problema que solucionaste. ¿Podría darme un ejemplo más completo de cómo está reconociendo el lector hid rfid y cómo está trabajando con sus lecturas?
También tengo un lector HID que simula el teclado y quiero controlar cuándo empezar a leer o capturar su respuesta sin que afecte lo que está haciendo el operador.
si me pueden ayudar se los agradecere
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Deshabilitar Alt-Tab director0407031 API de Windows 2 30-05-2008 20:24:26
Deshabilitar datatimepicker schaka Varios 2 27-04-2008 22:56:55
Deshabilitar el tab un for eldonfsr C++ Builder 4 25-07-2007 10:36:25
Deshabilitar FKs micayael Firebird e Interbase 1 09-03-2007 18:52:53
deshabilitar los iconos superhopi Varios 8 23-12-2006 02:30:21


La franja horaria es GMT +2. Ahora son las 10:54:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi