usb barkod okuyucudan gelen veri (çözüldü)

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

usb barkod okuyucudan gelen veri (çözüldü)

Mesaj gönderen esistem »

Arkadaşlar merhaba, birkaç gündür konuyu araştırıyorum fakat bir sonuca ulaşamadım. Elimde usb barkod okuyucu var. zebex marka. Amacım, form aktif değilken bu barkod okuyucudan gelen bilgileri almak. Bir ton dosya indirdim denedim fakat bir türlü sonuca ulaşamadım. en son HIDComponente diye bir komponent paketi indirip denedim, demolarında cihazın bilgileri geliyor (vendor ve product id) fakat form arka planda yada aşağıda iken gelen okutmayı bir türlü alamadım. Konu hakkında bilgisi olan arkadaşlardan yardım bekliyorum.
En son esistem tarafından 03 Eki 2014 11:19 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
alidirik
Üye
Mesajlar: 16
Kayıt: 04 Eyl 2010 11:15

Re: usb barkod okuyucudan gelen veri

Mesaj gönderen alidirik »

Sizin istediğiniz yöntem seri port mantığında var.
Zebex okuyucuların yeni modellerinde USB-COM desteği mevcut.
Bu yöntemde cihaz USB den bilgisayara takılı fakat Seri port mantığı ile çalışıyor.
Konu ile ilgili http://www.bilkur.com.tr de ürün sayfasına bakın veya Bilkur ile görüşebilirsiniz.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: usb barkod okuyucudan gelen veri (çözüldü)

Mesaj gönderen esistem »

Tekrar selam arkadaşlar.
Yoğun araştırma sonucu sorunu çözdüm (ufak bir pürüz dışında). Bilgisayara bağlı klavye, mouse, HID cihaz (usb barkod okuyucu) vs.vs. hepsinden gelen veriyi alıp, hangi cihazdan geldiğini bulup, ona göre işlem yaptırıyorum, fakat şöyle bir sorun oluştu;
Bende usb barkod okuyucu var, okuttuğum zaman gelen veriyi alıp işleyebiliyorum ama mesela kullanıcı excel dosyası açmış onda çalışıyor, ben programdan arka planda gelen veriyi alıyorum ama kullanıcı excelde hangi hücrede ise gidip okutulan veriyi orayada basıyor. Bu konuda yardımcı olabilirseniz ne mutlu bana.
Kodu aşağıda veriyorum ihtiyacı olan arkadaşlar kullanabilirler.

Kod: Tümünü seç

unit Unit1;

interface

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

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

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;
    Memo1: TMemo;

    procedure FormCreate(Sender: TObject);
  private
    { Private }
    Rid: packed array [0..RI_NUM_DEVICE-1] of TRAWInputDevice;
    procedure WmInput(var Mess: TMessage); message WM_INPUT;
  public
    { Public }
  end;

var
  Form1: TForm1;
  strOut, labelout: String;
  const 
  MY_MESSAGE = WM_USER + 4242;
implementation

{$R *.dfm}

////////////////////////////////////////////////////////////////////////////////
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;
  strout := '';
  RegisterRawInputDevices(@Rid, RI_NUM_DEVICE, SizeOf(TRAWInputDevice));
end;

procedure TForm1.WmInput(var Mess: TMessage);
var
  RI: PRAWINPUT;
  dwSize: UINT;
  lpb: PBYTE;
  DataSize: DWORD;
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);
    labelout := 'RAWINPUT.header.hDevice: ' + IntToStr(RI.header.hDevice) + #13;
    case RI.header.dwType of

      RIM_TYPEKEYBOARD:
            begin
{
if (RI.Data.keyboard.Mess=257) then  // keyup
                memo1.Lines.Add( IntToStr(RI.header.hDevice) + ' - ' +
                                 inttostr(RI.Data.keyboard.VKey) + ' - ' +
                                 Chr(RI.Data.keyboard.VKey) );
}
//if (RI.header.hDevice = 12255843) then begin  // usb barcode scanner

if (RI.Data.keyboard.Mess = 257) then  begin // keyup
if (RI.Data.keyboard.VKey<>13) then begin // send key not enter
strout := strout + Chr(RI.Data.keyboard.VKey);
                                    end else begin // send key enter
memo1.Lines.Add(strout);
strout := '';
                                             end;  // send key enter
                                       end;

//                                       end;  // usb barcode scanner
            end;
    end;

  finally
    FreeMem(lpb,DataSize);
  end;
  Label1.Caption := labelout;
end;

end.
Gooser
Üye
Mesajlar: 1
Kayıt: 03 Oca 2018 02:05

Re: usb barkod okuyucudan gelen veri (çözüldü)

Mesaj gönderen Gooser »

@esistem Yıllar sonra geldim kodu kullandım. Yardımın için teşekkür ederim.
Cevapla