folder Tahribat.com Forumları
linefolder C#, Asp.Net, .Net Core
linefolder Barkod Okuyucu Verisinin Yakalanmasi



Barkod Okuyucu Verisinin Yakalanmasi

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek

    15 tatilde istanbula gittigimde bizim amcaoglunun kucuk bi dukkan actigini ogrendim. o dukkani acar acmaz barkod sistemi getirmek icin bi kac kisi gelmis ve cihaz icin 300 tl , program icin ise 3000 tl istemisler. o da hemen beni aradi ve uygun mu diye sordu, bende dogal olarak yuh dedim ! ve agzima tukureyim "ben sana yaparim amcaoglu, sikinti yapma.." dedim.

    ise koyuldugum zaman su barkod okuyucuyu ( http://www.argox.com/content.php?sno=0000075&P_ID=34 ) 80 lira civari bi fiyata internetten aldik. soradan ogrendim ki :) , usb ile baglanti kuran barkod okuyucular klavyeyi simule ediyormus,, yani siz barkod u okuttugunuz anda klavye focusunun oldugu yere barkod verisini yaziyo. bu aslinda benim icin kucuk bi sikinti olusturuyodu cunku eger programin gerekli yerinde barkod okutulmaz ise, barkodu okutturmanin hic bi yarari olmayacakti. cihazin manuel ini okudugumda prefix ve suffix olarak karakterler ayarlayabildigimi ogrendim. boylece klavye hook chain e dahil olup, o karakter cift i (benim ayarladigim,,,  private const Keys HK_PRE = Keys.F5;  //0x0007; private const Keys HK_PRE_VALID = Keys.OemOpenBrackets; ) cok kisa bi sure icinde geldiginde , hook chain in diger uyelerine barkod verisini gondermeyip, kendi programima cekebilicektim. ve bende aynen bu soyledigim isi yaptim ve dedim ki , gunun birinde baska birisine lazim olabilir , bunu tahribatta paylasayim. 

    bug 1 : bu kod parcasi icin aslinda baska bi thread acip , senkronizasyon nesnelerini kullanarak yazdigim kodda barkod verisinin ilk prefix karakteri olan F5 i kacirmadan(yani hook chaindeki diger uyelere gondermeden) duzenlenebilir ancak soyledigim gibi yalnizca amcaoglu icin yazdigim bi proje oldugundan o kadar da kasmadim. 

    bug 2 : barkod yakalandiktan sora event e bagli delegateler cagrildigi sira aslinda asenkron cagrilmali, cunku low level keyboard hook icinde iken cok kisa bi surede islemler tamamlanip geri donulmeli ( en azindan ben oyle hatirliyorum ) ancak yine amcaoglunun projesi oldugu icin o denli kasmadim ( aslinda bunda kasicak bisey de yok ya neyse , isteyen arkadas duzenleyebilir )

     

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using Keys=System.Windows.Forms.Keys;
    
    namespace BarcodeScanner
    {
    
        public class CouldntHookException : Exception
        {
            public override string Message
            {
                get
                {
                    return "barcode_input_handler couldnt add itself to the hook chain.";
                }
            }
    
            public override string ToString()
            {
                return Message;
            }
        }
    
        
        public class barcode_input_handler : IDisposable
        {
            private delegate long delLowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
    
            public delegate void delInput(string scanCode);
    
            public event delInput InputEvent;
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern long SetWindowsHookEx(int idHook,
                delLowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool UnhookWindowsHookEx(long hhk);
    
            [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern long CallNextHookEx(long hhk, int nCode,
                IntPtr wParam, IntPtr lParam);
    
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            private static extern IntPtr GetModuleHandle(string lpModuleName);
    
    
    
            private const int WH_KEYBOARD_LL = 13;
            private const int WM_KEYDOWN = 0x0100;
            private const int WM_KEYUP = 0x0101;
            private const Keys HK_PRE = Keys.F5;  //0x0007;
            private const Keys HK_PRE_VALID = Keys.OemOpenBrackets;
            private const Keys HK_SUFF = Keys.Oemtilde; //0x000A;
            private long _hHook = 0;
            private StringBuilder _buffer;
            private bool _hookFlag;
            private bool _hookValid;
            delLowLevelKeyboardProc _procHook;
            taglParam _lastKey;
    
            struct taglParam
            {
                public int _vkCode, _scanCode, _flags, _time;
    
                public taglParam(int vkCode, int scanCode, int flags, int time)
                { _vkCode = vkCode; _scanCode = scanCode; _flags = flags; _time = time; }
            };
    
            public barcode_input_handler()
            {
                _buffer = new StringBuilder(128);
                _hookFlag = false;
                _hookValid = false;
    
                _procHook = new delLowLevelKeyboardProc(HookHandleProc);
                _hHook = SetHook();
    
                if (_hHook == 0)
                    throw new CouldntHookException();
            }
    
            ~barcode_input_handler()
            {
                Dispose();
            }
    
            private long SetHook()
            {
                
                using (Process cp = Process.GetCurrentProcess())
                using (ProcessModule cm = cp.MainModule)
                {
                    return SetWindowsHookEx(WH_KEYBOARD_LL, _procHook,
                        GetModuleHandle(cm.ModuleName), 0);
                }
            }
    
            private long HookHandleProc(int nCode, IntPtr wParam, IntPtr lParam)
            {
                if (nCode < 0 || wParam != (IntPtr)WM_KEYDOWN)
                    return CallNextHookEx(_hHook, nCode, wParam, lParam);
    
                taglParam lp = (taglParam)Marshal.PtrToStructure(lParam, typeof(taglParam));
    
                if (_hookFlag)
                {
                    if ((Keys)lp._vkCode == HK_SUFF)
                    {
                        _hookFlag = false;
                        _hookValid = false;
                        //trigger event here
                        //use begininvoke instead of invoke  ;)
                        InputEvent.Invoke(_buffer.ToString());
                        return -1;
                    }
    
                    _buffer.Append((char)lp._vkCode);
                    return -1;
                }
                else if ((Keys)lp._vkCode == HK_PRE)
                {
                    _hookValid = true;
                    _lastKey = lp;
                }
                else if (_hookValid && (Keys)lp._vkCode == HK_PRE_VALID)
                {
                    if (lp._time - _lastKey._time < 50)
                    {
                        _buffer.Clear();
                        _hookFlag = true;
                        return -1;
                    }
                    else
                        _hookValid = false;
                }
    
    
                return CallNextHookEx(_hHook, nCode, wParam, lParam);
            }
    
            private bool DeleteHook()
            {
                return UnhookWindowsHookEx(_hHook);
            }
    
            public void Dispose()
            {
                DeleteHook();
    
                GC.SuppressFinalize(this);
            }
        }
    }
    

    ..
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    guru
    guru's avatar
    Kayıt Tarihi: 30/Mart/2007
    Erkek

    kullanimina ornek olsun diye programin o kismindan bi parca atiyorum buraya da 

        public partial class MainForm : Form
        {
    /************************************************************/
            barcode_input_handler _inp_handler;
    
            Order _order;
            List<Order> _tempOrders;
    
            public MainForm()
            {
                InitializeComponent();
                MyInit();
            }
    
            private void MyInit()
            {
    /****************************************************************/
                _inp_handler = new barcode_input_handler();
                _inp_handler.InputEvent += inp_handler_InputEvent;
    
                _order = new Order();
                _tempOrders = new List<Order>();
    
                _order.PriceChanged += _order_PriceChanged;
    
                lblTax.Text =
                    lblSummary.Text =
                    lblPrice.Text = (0).ToString("C");
    
                lblWarn.Text = "";
            }
    
            void _order_PriceChanged(decimal price, decimal tax)
            {
                lblTax.Text = tax.ToString("C");
                lblSummary.Text = price.ToString("C");
                lblPrice.Text = (price - tax).ToString("C");
            }
    
    /***************************************************************/
            void inp_handler_InputEvent(string _scanCode)
            {
                //this.Text = _scanCode;
                Product pr = _order.select(_scanCode);
    
                if (pr == null)
                {
                    lblWarn.Text = "Urun Stokta Yok/Kalmamis";
                    return;
                }
    
                add_product_to_order(pr);
            }

     

     

     


    ..
Toplam Hit: 1965 Toplam Mesaj: 2