USB Barkod Okuyucular Hakında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

USB Barkod Okuyucular Hakında

Mesaj gönderen adelphiforumz »

Selamlar

Klavye emulasyonlu bir barkod okuyucu takılı olduğunda barkod okutulunca formun Keydown özelliği tetikleniyor.
Fakat Gelen verinin klavyedenmi yoksa barkod okuyucudanmı geldiğini ayırt etme şansım varmıdır.

Teşekkürer
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: USB Barkod Okuyucular Hakında

Mesaj gönderen mrmarman »

Gelen veriyi string bir değişkene al ve bu değişkenin ilk karakterini oku. Sana nereden geldiğini söyleyecek.
Resim
Resim ....Resim
alidirik
Üye
Mesajlar: 16
Kayıt: 04 Eyl 2010 11:15

Re: USB Barkod Okuyucular Hakında

Mesaj gönderen alidirik »

Standart barkod okuyucularda KeyDown değil, KeyPress in tetiklenmesi gerekiyor.
Barkod okuyucuda özel bir ayar yapılmamışsa barkod verisi + CRLF şeklinde çalışır.
Bağlantı şekli USB ise taranan veri klavye portuna aktarılır.
Barkod okuyucular programlanabilen cihazlardır.
Bu tarz bir ayrımı barkod okuyucuyu programlayarak yapabilirsiniz.
Önerim ilgili barkod okuyucuda okunan barkodun başına özel bir veya birden fazla karekter ekleyin.
ve mrmarman arkadaşında bahsettiği yöntemde gelen verinin başındaki karekterden veri tipini çözümleyin.
Karekter ekleme işlemini barkod okuyucunun kullanım/programlama kılavuzundan yapabilirsiniz.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4740
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: USB Barkod Okuyucular Hakında

Mesaj gönderen mrmarman »

Bir ek bilgi, aynı bilgisayara bağlı birden fazla barcode cihazı varsa ( mesela biri sabit birisi kablolu el tipi vs. ) HID cihaz tespiti ve mesaj takibi ile hangisinden geldiğini de anlayabiliyoruz. Bu metod ile de tek adet olsa da takip mümkün.

Bu HID takibi şekilde herhangi bir input kutusu olmaksızın veya barcode oku vs. Butonu gibi ön hazırlığa gerek duyulmadan anlık barcode algılamak mümkün.
Resim
Resim ....Resim
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: USB Barkod Okuyucular Hakında

Mesaj gönderen adelphiforumz »

merhabalar
alidirik
test ettiğimde klavyede usb den gelen veridede keydown, keypress ve keyup tetikleniyor buradan çözemedim

mrmarman
ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
içerisinde Msg kontrolleri yaptığımda klavye ile usb yi ayıracak bir mesaj farkı göremedim muhtemelen Msg başka birşey ile daha kontrol edilerek
bulunması lazım fakat tam olarak işin içinden çıkamadım

Forumları araştırırken rawinput olarak bir işlemden bahsediliyor ve bu yolla devicelar ayrılabiliyor deniyor
şu andada bunu araştırıyorum konu hakkında bilgisi olan varsa yardımcı olabilirmi.

Teşekkürler
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
adelphiforumz
Üye
Mesajlar: 602
Kayıt: 01 Nis 2008 05:38
Konum: İstanbul

Re: USB Barkod Okuyucular Hakında

Mesaj gönderen adelphiforumz »

Bir örnek üzerinden test yapıyorum fakat bende klavye veriside barkod veriside keybord olarak geliyor
acaba usb barkod okuyucu olan ve zamanı olan bir arkadaş varsa zahmet olmazsa test etmesi mümkünmü
acaba bendeki barkod okuyucumu bunu yapamıyor.

Teşekkürler

Kod: Tümünü seç

unit Unit1;

interface

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

////////////////////////////////////////////////////////////////////////////////

type
  USHORT = Word;

////////////////////////////////////////////////////////////////////////////////

const
  RI_NUM_DEVICE = 2;

const
  WM_INPUT  = $00FF;

const
  RIDEV_REMOVE                = $00000001;
  RIDEV_EXCLUDE               = $00000010;
  RIDEV_PAGEONLY              = $00000020;
  RIDEV_NOLEGACY              = $00000030;
  RIDEV_INPUTSINK             = $00000100;
  RIDEV_CAPTUREMOUSE          = $00000200;
  RIDEV_NOHOTKEYS             = $00000200;
  RIDEV_APPKEYS               = $00000400;

  RIM_TYPEMOUSE               = $00000000;
  RIM_TYPEKEYBOARD            = $00000001;
  RIM_TYPEHID                 = $00000002;

  RID_INPUT                   = $10000003;
  RID_HEADER                  = $10000005;

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

////////////////////////////////////////////////////////////////////////////////

type
  TRAWINPUTDEVICE = packed record
    usUsagePage : WORD;
    usUsage     : WORD;
    dwFlags     : DWORD;
    hwndTarget  : HWND;
  end;
  PRAWINPUTDEVICE = ^TRAWINPUTDEVICE;

  TRAWINPUTHEADER = packed record
    dwType    : DWORD;
    dwSize    : DWORD;
    hDevice   : THANDLE;
    wParam    : WPARAM;
  end;
  PRAWINPUTHEADER = ^TRAWINPUTHEADER;

  TRMBUTTONS = packed record
    case Integer of
        0:(ulButtons: ULONG);
        1:(
           usButtonFlags : SHORT;
           usButtonData  : SHORT;
          );
    end;

  TRAWMOUSE = packed record
    usFlags            : SHORT;
    RMButtons          : TRMBUTTONS;
    ulRawButtons       : ULONG;
    lLastX             : LongInt;
    lLastY             : LongInt;
    ulExtraInformation : ULONG;
  end;
  PRAWMOUSE = ^TRAWMOUSE;

  TRAWKEYBOARD = packed record
    MakeCode         : SHORT;
    Flags            : SHORT;
    Reserved         : SHORT;
    VKey             : SHORT;
    Mess             : UINT;
    ExtraInformation : ULONG;
  end;
  PRAWKEYBOARD = ^TRAWKEYBOARD;

  TRAWHID = packed record
    dwSizeHid : DWORD;
    dwCount   : DWORD;
    bRawData  : BYTE;
  end;
  PTRAWHID = ^TRAWHID;

  TRAWINPUTDATA = packed record
    case Integer of
      0:(mouse    : TRAWMOUSE   );
      1:(keyboard : TRAWKEYBOARD);
      2:(hid      : TRAWHID     );
    end;

  TRAWINPUT = packed record
      header  : TRAWINPUTHEADER;
      data    : TRAWINPUTDATA;
  end;
  PRAWINPUT = ^TRAWINPUT;

  TRID_DEVICE_INFO_MOUSE = packed record
     dwId               : DWORD;
     dwNumberOfButtons  : DWORD;
     dwSampleRate       : DWORD;
  end;
  PRID_DEVICE_INFO_MOUSE = ^TRID_DEVICE_INFO_MOUSE;

  TRID_DEVICE_INFO_KEYBOARD = packed record
     dwType : DWORD;
     dwSubType              : DWORD;
     dwKeyboardMode         : DWORD;
     dwNumberOfFunctionKeys : DWORD;
     dwNumberOfIndicators   : DWORD;
     dwNumberOfKeysTotal    : DWORD;
  end;
  PRID_DEVICE_INFO_KEYBOARD = ^TRID_DEVICE_INFO_KEYBOARD;

  TRID_DEVICE_INFO_HID  = packed record
     dwVendorId       : DWORD;
     dwProductId      : DWORD;
     dwVersionNumber  : DWORD;
     usUsagePage      : USHORT;
     usUsage          : USHORT;
     end;
  PRID_DEVICE_INFO_HID = ^TRID_DEVICE_INFO_HID;

  TRID_DEVICE_INFO = packed record
      cbSize : DWORD;
      dwType : DWORD;
      case Integer of
        0:(mouse    : TRID_DEVICE_INFO_MOUSE   );
        1:(keyboard : TRID_DEVICE_INFO_KEYBOARD);
        2:(hid      : TRID_DEVICE_INFO_HID     );
  end;
  PRID_DEVICE_INFO = ^TRID_DEVICE_INFO;

////////////////////////////////////////////////////////////////////////////////

function RegisterRawInputDevices(pRawInputDevices: Pointer;uiNumDevices,cbSize: UINT): Boolean; stdcall; external 'user32.dll';
function GetRawInputData(hRawInput: Pointer; uiCommand:UINT; pData: Pointer; pcbSize: Pointer; cbSizeHeader: UINT): UINT; stdcall; external 'user32.dll';
function GetRawInputDeviceInfoA(hDevice: THandle; uiCommand:UINT; pData: Pointer; pcbSize: Pointer): UINT; stdcall; external 'user32.dll';

////////////////////////////////////////////////////////////////////////////////


type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private éŒ¾ }
    Rid: packed array [0..RI_NUM_DEVICE-1] of TRAWInputDevice;
    procedure WmInput(var Mess: TMessage); message WM_INPUT;
    function IntToBit(Value: Integer): String;
  public
    { Public éŒ¾ }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

////////////////////////////////////////////////////////////////////////////////

function TForm1.IntToBit(Value: Integer): String;
var
  i: integer;
begin
  for i:=31 downto 0 do
    if (Value shr i) = 1 then
      Result := Result + '1'
    else
      Result := Result + '0';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Rid[0].usUsagePage := $0001;
  Rid[0].usUsage     := $02;
  Rid[0].dwFlags     := RIDEV_INPUTSINK;  //0;
  Rid[0].hwndTarget  := Self.Handle;

  Rid[1].usUsagePage := $0001;
  Rid[1].usUsage     := $06;
  Rid[1].dwFlags     := RIDEV_INPUTSINK;
  Rid[1].hwndTarget  := Self.Handle;
  RegisterRawInputDevices(@Rid, RI_NUM_DEVICE, SizeOf(TRAWInputDevice));
end;


procedure TForm1.WmInput(var Mess: TMessage);
var
  i,l: Integer;
  RI: PRAWINPUT;
  dwSize: UINT;
  lpb: PBYTE;
  DataSize: DWORD;
  HID_DATA:array [0..15] of DWORD;
  P:PByte;
  tmpX,tmpY: Integer;
  pData: Pointer;
  DevName: PChar;
  NameSize: Integer;
  DevInfo: TRID_DEVICE_INFO;
  MouInfo: TRID_DEVICE_INFO_MOUSE;
  RIMou: PRAWINPUT;
  strOut: String;
begin

  GetRawInputData(PRAWINPUT(Mess.LParam), RID_INPUT, nil, @dwSize,SizeOf(TRAWINPUTHEADER));

  if dwSize = 0 then Exit;

  DataSize := SizeOf(BYTE) * dwSize;

  GetMem(lpb,DataSize);

  try
    GetRawInputData(PRAWINPUT(Mess.LParam), RID_INPUT, lpb, @dwSize, SizeOf(TRAWINPUTHEADER));
    RI := PRAWINPUT(lpb);

    strOut := 'RAWINPUT.header.hDevice: ' + IntToStr(RI.header.hDevice) + ' Device Type : ' + IntToStr(DevInfo.dwType) + ' ---- ';


    case RI.header.dwType of
      RIM_TYPEMOUSE:
            begin
              strOut := strOut + #13 + '-----';

              tmpX := RI.Data.mouse.lLastX;
              if tmpX > 0 then
              begin
                tmpX := tmpX shr 16;
              end
              else
              begin
                tmpX := -(($FFFF - tmpX) shr 16);
              end;

              tmpY := RI.Data.mouse.lLastY;
              if tmpY > 0 then
              begin
                tmpY := tmpY shr 16;
              end
              else
              begin
                tmpY := -(($FFFF - tmpY) shr 16);
              end;
              strOut := strOut + #13 + format(' MOUSE --- X: %d, Y: %d', [Tmpx, Tmpy]);

  {
              GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICENAME, nil, @dwSize);
              NameSize := dwSize;
              GetMem(DevName,dwSize);
              GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICENAME, Pointer(DevName), @dwSize);

              DevInfo.cbSize := SizeOf(TRID_DEVICE_INFO);
              dwSize := SizeOf(TRID_DEVICE_INFO);
              GetRawInputDeviceInfoA(RI.header.hDevice, RIDI_DEVICEINFO, @DevInfo, @dwSize);
              MouInfo := TRID_DEVICE_INFO_MOUSE(DevInfo.mouse);

              GetRawInputData(PRAWINPUT(Mess.LParam), RID_HEADER, nil, @dwSize, SizeOf(TRAWINPUTHEADER));
              DataSize := SizeOf(BYTE) * dwSize;
              GetMem(pData,DataSize);
              GetRawInputData(PRAWINPUT(Mess.LParam), RID_HEADER, pData, @dwSize, SizeOf(TRAWINPUTHEADER));
              RIMou := PRAWINPUT(pData);



              strOut := strOut + #13 + 'usFlags: ' + IntToBit(RIMou.Data.mouse.usFlags) + #13
                              + 'RMButtons.ulButtons: ' + IntToBit(RI.Data.mouse.RMButtons.ulButtons) + #13
                              + 'RMButtons.usButtonFlags: ' + IntToBit(RIMou.Data.mouse.RMButtons.usButtonFlags) + #13
                              + 'RMButtons.usButtonData: ' + IntToBit(RI.Data.mouse.RMButtons.usButtonData) + #13
                              + 'ulRawButtons: ' + IntToBit(RI.Data.mouse.ulRawButtons) + #13
                              + 'lLastX: ' + IntToStr(tmpX) + #13
                              + 'lLastY: ' + IntToStr(tmpY) + #13
                              + 'ulExtraInformation: ' + IntToBit(RI.Data.mouse.ulExtraInformation) + #13
                              + 'RIDI_DEVICENAME: ' + ' CharacterCount: ' +IntToStr(NameSize) + '  Name: ' + WideCharToString(DevName) + #13
                              + 'DevInfo.dwType: ' +IntToStr(DevInfo.dwType) + #13
                              + 'MouInfo.dwId: ' +IntToStr(MouInfo.dwId) + #13
                              + 'MouInfo.dwNumberOfButtons: ' +IntToStr(MouInfo.dwNumberOfButtons) + #13
                              + 'MouInfo.dwSampleRate: ' +IntToStr(MouInfo.dwSampleRate) + #13;
}
            end;


      RIM_TYPEKEYBOARD:
            begin
              strOut := strOut + #13 + ' KEYBOARD ---';
              strOut := strOut + #13 + Format('KeyBoard : %.2x',[RI.Data.keyboard.VKey]);
            end;

      RIM_TYPEHID:
            begin
              strOut := strOut + #13 + ' USB --- ';
              P := @RI.Data.hid.bRawData;
              for i:=0 to RI.Data.hid.dwCount-1 do
              begin
                HID_DATA[i] := 0;
                for l:=1 to RI.Data.hid.dwSizeHid do
                begin
                  HID_DATA[i] := (HID_DATA[i] shl 8) + P^;
                  Inc(P);
                end;
              end;

              for i:=0 to RI.Data.hid.dwCount-1 do
                strOut := strOut + #13 + Format('HID[%d] : %x',[i+1,HID_DATA[i]]);
            end;
    end;
  finally
    FreeMem(lpb,DataSize);
  end;

  Label1.Caption := strOut;

end;


end.

Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Kullanıcı avatarı
tuna
Üye
Mesajlar: 300
Kayıt: 07 Tem 2008 04:39
Konum: İstanbul

Re: USB Barkod Okuyucular Hakında

Mesaj gönderen tuna »

Arkadaşlar merhaba. Acaba bu konuyu çözebilen oldumu?.
Banada şimdi aynı olay gerekli. Usb barkod okuyucum var barkod okutulunca imlecin nerede olduğuna bakmadan istediğim değişkene veya textbox'a barkod içeriğinin gönderilmesini istiyorum. Verinin barkod'danmı klavyedenmi geldiğini de anlamam lazım.
Cevapla