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 private void MyInit void _order_PriceChanged / / void inp_handler_InputEvent { //this. Text = _scanCode; Product pr = _order. select ; if add_product_to_order ; } ..

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 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 ancak yine amcaoglunun projesi oldugu icin o denli kasmadim 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 } public override string ToString } public class barcode_input_handler : IDisposable { private delegate long delLowLevelKeyboardProc ; public delegate void delInput ; public event delInput InputEvent; private static extern long SetWindowsHookEx ; private static extern bool UnhookWindowsHookEx ; private static extern long CallNextHookEx ; private static extern IntPtr GetModuleHandle ; 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 }; public barcode_input_handler barcode_input_handler private long SetHook { using (Process cp = Process. GetCurrentProcess using } private long HookHandleProc { if (nCode < 0 || wParam!= WM_KEYDOWN) return CallNextHookEx ; taglParam lp = Marshal. PtrToStructure(lParam, typeof ; if { if lp. _vkCode HK_SUFF) _buffer. Append lp. _vkCode); return -1; } else if lp. _vkCode HK_PRE) else if (_hookValid && lp. _vkCode HK_PRE_VALID) { if (lp. _time - _lastKey. _time < 50) else _hookValid = false; } return CallNextHookEx ; } private bool DeleteHook public void Dispose } } ..