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

2021-09-23 22:31:34 字數 1931 閱讀 4903

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...