usb介面的掃碼槍基本就相當於乙個電腦外設,在windows系統中,甚至可以簡單到不做任何處理,就能在焦點位置獲取掃碼槍返回的資料。但是作為乙個程式設計師,總是會遇到客戶各種神奇的需求,比如乙個比較常見的功能:客戶手拿掃碼槍不管掃什麼,軟體都能自動辨別是什麼型別的條碼,叭叭叭掃好幾種條碼的時候,軟體能夠區分出來各種條碼,並且根據條碼調出相關資料。
吶,這個需求的話,就直接把手動更改焦點位置來掃碼的可能性pass了,客戶沒有那麼智慧型,並且客戶很懶。這樣的話,就需要根據條碼的內容來確定是什麼條碼,然後再和後台資料一起顯示到軟體介面上。
使用windowinterophelper獲取傳入窗體的控制代碼,並且繫結threadfiltermessage事件,達到從而可以觸發processrawinputmessage方法
/// /// 將***附著到窗體上
///
/// 需要附著的窗體(wpf)
public void attach(window form)
};doattach(hwnd);
}/// /// 監聽繫結
///
/// 裝置指標
private void doattach(intptr hwnd)
processrawinputmessage方法中,判斷傳入的字串是否是掃碼槍設定的結束字元(掃碼的字串是乙個乙個傳入的),如果不是,就加入到buffer中,如果是,則觸發firebarcodescanned方法
/// /// 處理wm_input訊息
///
/// rawinputheader的指標
/// 按鍵是否被處理
private bool processrawinputmessage(intptr rawinputheader)
else
}return handled;
}
firebarcodescanned方法中,則會呼叫介面初始化時,繫結的事件,傳入掃碼的字串
/// /// 觸發掃碼事件
///
/// 掃碼裝置資訊
private void firebarcodescanned(barcodescannerdeviceinfo deviceinfo)}}
2.頁面呼叫
這裡我使用的mvvm模式,所以在viewmodel層呼叫,但是只要能拿到view的物件,在那一層都沒有關係
barcodescannerlistener = new barcodescannerlistener();
barcodescannerlistener.attach((window)getview());
barcodescannerlistener.barcodescanned += onbarcodescanned;
在傳入的事件中,獲取barcode屬性即可得到掃瞄的值
private void onbarcodescanned(object sender, eventargs e)
3.配置條碼槍的硬體id
需要在windows裝置管理器中,找到掃碼槍的裝置id就是在這裡,原文作者沒有講清楚。
第一步:尋找usb裝置的id;win10系統在裝置管理->人體學輸入裝置->找到usb選項的裝置id
完整demo
實現條碼槍的無焦點掃碼
在上一家公司創業初期,我接觸的第乙個專案是醫院的 室消毒包管理系統,幾乎一人之力用了兩個多月的時間,完成了基本的開發工作。回想起來,當時有個設計印象深刻。趁著還有記憶,記錄下來,供大家一時之需。當時開發的時候,對於物資的管理,自然離不開條碼槍的角色。設計的是無線條碼槍,讓工作人員可以自由的在作業現場...
掃碼槍獲取資料處理
掃碼槍的工作原理和鍵盤輸入事件一樣 方法一 在created鉤子函式裡面監聽鍵盤輸入的事件獲取掃碼槍輸入的值 var b var this this document.onkeydown function else this.msg b 方法二 通過輸入框聚焦事件獲取輸入的值 不過大部分的掃碼槍需求...
js 條碼槍掃瞄 js獲取USB掃碼槍資料
前言找了很多相關的教程不太好用,汲取各家之長總結精簡了一下 原理掃碼槍掃瞄到的條形碼每一位會觸發一次onkeydown事件 比如掃瞄條碼位 1234567890 的條形碼,會連續執行10次onkeydown事件 條碼掃瞄到最後一位,會直接觸發enter 支援vue data else if e.wh...