實現條碼槍的無焦點掃碼

2021-08-25 06:08:45 字數 2780 閱讀 4388

在上一家公司創業初期,我接觸的第乙個專案是醫院的**室消毒包管理系統,幾乎一人之力用了兩個多月的時間,完成了基本的開發工作。回想起來,當時有個設計印象深刻。趁著還有記憶,記錄下來,供大家一時之需。

當時開發的時候,對於物資的管理,自然離不開條碼槍的角色。設計的是無線條碼槍,讓工作人員可以自由的在作業現場走動。但是有個使用者體驗問題,就是一般情況下,條碼槍掃瞄的時候,都需要將輸入焦點放到文字框之中,這個限制會造成極為不好的使用者體驗。此外,在流程設計的時候,實際上一系列操作動作,是使用掃瞄不同命令條碼後,實現的。比如啟動某功能,掃碼後,確定繼續下乙個動作等等,全程不用碰pc機。

所以問題的核心就在於是否可以接觸焦點必須放到文字框之中的限制。

此方法並不是原創,但是原始**是對winform平台進行開發的,被我修改為支援wpf平台。並且原文的鏈結已經失效,所以這段**還是很有價值的。

使用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 或者串列埠.掃瞄槍負責識別條碼,電腦收到後執行業務的邏輯.有時候只是簡單的資料採集工作,資料傳到伺服器雲端,放台電腦在那兒顯得浪費而且需要昂貴的維護.而小巧靈活而且 低廉的樹莓派同學馬上舉手說 我可以 ...

WPF實現無線掃碼槍無焦點自動獲取資料並邏輯處理

usb介面的掃碼槍基本就相當於乙個電腦外設,在windows系統中,甚至可以簡單到不做任何處理,就能在焦點位置獲取掃碼槍返回的資料。但是作為乙個程式設計師,總是會遇到客戶各種神奇的需求,比如乙個比較常見的功能 客戶手拿掃碼槍不管掃什麼,軟體都能自動辨別是什麼型別的條碼,叭叭叭掃好幾種條碼的時候,軟體...

掃碼槍掃碼的問題

今天來總結下,掃碼槍遇到的一些問題。ps 參考了 博主的文章 剛開始掃碼用的是edittext edittext edittext edittext findviewbyid r.id edittext edittext.addtextchangedlistener watcher private ...