条码扫描器接口编程(C#)
C# 生成、识别条形码(Bar Code)和二维码(QR Code)
C# 生成、识别条形码(BarCode)和二维码(QR Code)
能够用于生成和识别条形码和二维码的第三方控件很多,这里介绍如何使用Free Spire.Barcode来实现这些操作。
第一步:通过Visual Studio 2015的NuGet Package Manager下载安装免费版Spire.Barcode
第二步:直接进入代码编写
1.创建条形码
2.创建二维码
3. 读取条码/二维码
如果一张图片上只有一个条形码或二维码,可以用ScanOne来返回一个string类型的值:
如果一张图片上不止一个条形码或二维码,可以用Scan方法来返回一个sting[]类型的字符串集合:
注:生成的图片中带有E-ICEBLUE字样,去除水印的代码如下。
其中的key值需要发邮件联系E-iceblue公司免费获取。
BarcodeSettings.ApplyKey("......");
《本文完》。
Intermec和TSC常见故障及处理
Intermec和TSC常见故障及处理深圳市仁伟达科技有限公司2009年05月23日Intermec3400.3440.3600打印机故障排除1、标签上有污迹。
(1)、打印机头不洁。
清洁打印机头。
(2)、标签质量或者色带太差。
更换成Inermec标签及(或)碳带。
(3)、打印介质的敏感度设置不正确。
改变敏感度设定,使之符合正在使用的介质类型。
2、字迹太浅或者太深(1)、敏感度指令设置不正确。
改变敏感度设定,使之符合正在使用的介质类型。
(2)、打印机头不洁。
清洁打印机头。
3、字没有打在标签上。
打印机进纸不当。
检查并确保色带安装正常。
1、打字质量太差。
(1)、介质敏感度不正确。
改变敏感度设定,使之符合正在使用的介质类型。
(2)、打印机头不洁。
清洁打印头。
(3)、打印对比度不均匀(密度)。
调节偏调螺丝。
(4)、使用不当的标签与色带型号打印。
(5)、色带有褶皱。
检查色带安装是否正确,调节偏调螺丝。
5、直接热敏/热感应开关设定的位置不对。
把DIP的开关设定在正使用的介质型号上。
扫描枪常见问题1、扫描器不工作一、扫描器未通电。
检查系统电源确保已连接电源。
二、使用了不正确的接口电缆。
确保使用了正确的接口电缆。
三、接口/电源电缆松动。
确保所有电缆连接已固定。
2、扫描器不对条码解码。
一、未按条码类型对扫描器编程。
确保已对扫描器编程,使其可读取要扫描的条码类型。
二、条码不可读。
确保条码无缺陷,尝试扫面具有相同条码类型的测试条码。
三、扫描器与条码间的距离不正确。
将扫描器移近或远离条码。
3、扫描器正在对条码解码,但尚未将数据传输到主机。
一、未按正确的接口主机接口对扫描器编程。
扫描适当的主机参数条码。
二、接口电缆松动。
确保所有电缆连接已固定。
4、扫描数据在主机上显示不正确。
未按正确的主机接口对扫描器编程。
扫描适当的主机参数条码。
扫描器蜂鸣器指示标准使用低/中/高蜂鸣声开机短而中的蜂鸣声条码已解码长而低的蜂鸣声检测到传输错误,数据被忽略参数菜单扫描高/低/高/低蜂鸣声已成功设置参数高/低蜂鸣声已执行正确的编程序列低/高蜂鸣声编程序列不正确,或扫描了“取消”条码扫描器LCD指示关闭扫描器已打开并已作好扫描准备,但扫描器未通电。
.NETC#利用ZXing生成、识别二维码条形码
.NETC#利⽤ZXing⽣成、识别⼆维码条形码⼀、⾸先下载 然后将对应版本 .dll 拖⼊项⽬中,再引⽤之。
主要是⽤ BarcodeWriter、BarcodeReader。
⼆、⽣成⼆维码.NET 平台的代码始终要简单些。
QrCodeEncodingOptions options = new QrCodeEncodingOptions();options.CharacterSet = "UTF-8";options.DisableECI = true; // Extended Channel Interpretation (ECI) 主要⽤于特殊的字符集。
并不是所有的扫描器都⽀持这种编码。
options.ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.H; // 纠错级别options.Width = 300;options.Height = 300;options.Margin = 1;// options.Hints,更多属性,也可以在这⾥添加。
BarcodeWriter writer = new BarcodeWriter();writer.Format = BarcodeFormat.QR_CODE;writer.Options = options;Response.Clear();using (Bitmap bmp = writer.Write("")) // Write 具备⽣成、写⼊两个功能{MemoryStream ms = new MemoryStream();{bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Png);Response.ContentType = "image/png";Response.BinaryWrite(ms.ToArray());}}Response.End();纠错级别:1. L - 约 7% 纠错能⼒。
Barcode 扫描器 模块 用户 手册说明书
Barcode Scanner ModuleUser ManualThis is a small 1D/2D codes reader, by using the intelligent image recognition algorithm, it will decode the barcode or 2D code on paper or screen, fast and accurately.Through the onboard USB and UART interface, it can be directly plugged into a computer, or be easily integrated to kinds of devices due to its small form factor. FEATURES⚫Easy to use, requires no knowledges of image recognition⚫Decodes various common 1D/2D codes such as Barcode, QR code etc.⚫Onboard micro USB and UART serial port, allows to connect with computers or embedded devices⚫Configurable via scanning 'configuration code'⚫Onboard light source, works in the darkSPECIFICATIONSOverview (1)Features (1)Specifications (2)Support barcodes (5)Scanning Instructions (6)Scanning Area (6)Scanning Way (7)Setting Instruction (9)Hardware connection (9)Setting Codes (9)Setting code (9)Restore Factory Setting (10)Users Default Setting (11)UART Communication (11)USB Communication (12)Scanning Mode (13)Lighting and Targeting (18)Ouput indication (19)Data Edit (23)Barcode types Enable/Diable (34)Appendix A: Default setting table (45)Appendix B: Common UART command (47)Appendix C: CODE ID List (48)Appendix D: ASCII table (49)Appendix E: Data Code (55)Appendix F: Save and Remove (57)✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓SCANNING AREAScanning distance: These values are all be measured indoor (250 lux)The min distance is based on the length of barcode and the scanning angle.If you want to house the scanner with window, please note that:⚫The window should be colorless⚫Check the surface of window carefully, make sure they are clean, smooth and have not scratch.⚫Let the windows cave in the case⚫Paralleling window with scanner without skew. If you locate the window improperly, it will down the scanning performance.⚫The window should close to and be in front of the scanner reader (don’t touch) The distance between window and scanner protect the scanner from drop and crash. SCANNING WAYWhile using the Barcode Scanner Module to scan 1D/2D barcodes, it allows some tilt, skew and pitch. However, you had better to reduce them for better and faster scanning result.TiltYou must keep the barcode inside thearea of white light. If the barcode is inside thescanning area, the tilt angle could be 360°. Toimprove the scanning rate, recommend tokeep vertical scanning.SkewSkew will reduce the width and space of barcode (scanned), it is the threshold dimension of high density barcode. It supports up to 65°. However, you’d better reduce the skew for better and faster scanning.PitchPitch will decrease the height of barcode. 2° to 3° is the best scanning angle, which could avoid the direct reflection of barcode. Barcode Scanner Module supports up to 60° pitch angle. But you should reduce it for better and faster scanning.Setting commands are provided, you could refer to this chapter to configure the Barcode Scanner Module. The factory setting could meet the requirement of common using, users need not more setting.HARDWARE CONNECTIONThis module supports two communicating interfaces. You can connect the USB interface to your device with micro USB cable. Or you can connect the UART interface to your device. If you want to test the UART interface with PC, you require an TTL to USB board like our CP2102 (should be purchased separately).VCC: 5VTx: Transmit Pin (Connect to Rx of MCU/CP2102)Rx: Receive Pin (Connect to Tx of MCU/CP2102)GND: GroundSETTING CODESUsers could scan the setting codes to configure the Barcode Scanner Module SETTING CODEYou can scan these two codes to enable/disable the setting code function. Enable it, you could scan setting codes for configuration. And setting code is invalid if disable.Open/Close:Output content:RESTORE FACTORY SETTINGYou can scan this setting code to restore to factory setting if require.Open Setting Code FunctionClose Setting Code FunctionDon't Output Content ofSetting CodeOutput Content of Setting CodeRestore Factory SettingUSERS DEFAULT SETTINGExcept the factory setting, users can save the setting as user default setting. By scanning the “Save Current Setting as User Default Setting” code, you can save your current setting as default setting. If there was default setting, and this operating will cover the old information.By scann ing the code “Restore User Default Setting” can restore the module to user default setting.UART COMMUNICATIONIf you connect the module to MCU by UART interface. You must set the correct UART communication parameters for success communicating. The default parameters of UART interface of module are that: Baud rate: 9600bps, Data bit: 8, Stop bit: 1 Scanning this setting code, it switches the communication interface to UART.Save Current Setting as UserDefault Setting Restore User Default SettingUART Output1.Baud rate Setting1200bps4800bps*9600bps14400bps19600bps38400bps57600bps115200bps USB COMMUNICATIONB PC KeyboardWhen you connect the module with USB cable, you can set the module to keyboard input mode by scanning this code.USB PC KeyboardB Virtual PortYou can set the module to USB virtual port mode by scanning this code.USB Virtual PortSCANNING MODE1.Manual ModeManual Mode is default scanning mode. In this mode, user should press thebutton to begin scanning, and it will finish after scanned or button release.Manual ModeSleepIn manual mode, module could enter sleep mode if it being idle for some time. You can scan this code to configure this function.Enable Sleep Function Disable Sleep FunctionDefault setting is that the module will enter Sleep mode after 30s if module keeps idle. And you can wake it up by press button, module will restart after waking.2.Continuous ModeIn Continuous Mode, the module will keep scanning automatically. After it success scanning and output result, or reach the timeout of scanning time, the module will begin its next scan after a certain time (configurable). User should single press the button to stop the scanning and single press again to continue.Continuous ModeSingle Scanning TimeIn Continuous Mode, this parameter set the max scanning time for per scanning behavior. If the module success scanning or the its scanning time reach the max1000ms3000ms*5000ms infinitesingle scanning time, module will enter the non-scanning interval. The range of single scanning time should be 0.1~25.5s. If it is set to 0, it means that scanning time is infinite. It is 5.0s by default.It is the interval between two scanning behaviors. That is module will scan nothing after last scanning for this interval time before and begin its next scanning. The setting range of this interval is 0~25.5s. It is 1.0s by default.No Interval500ms*1000ms1500ms2000ms3.Sensing ModeIn Sensing Mode, the module will detect the ambient brightness, if the brightness change, module will begin scanning after an image stabilization time (configurable). After one scanning (success or timeout), module will enter detecting state again after a certain time (configurable). Module will keep this cycle unless: If timeout, module will stop scanning and in detecting state automatically. In Sensing Mode, user could also press the button to scan and module will back to detecting after success scanning or button release.Sensing ModeIn Sensing Mode, this parameter set the max scanning time for per scanning behavior. If the module success scanning or the its scanning time reach the max single scanning time, module will enter the non-scanning interval. The range of single scanning time should be 0.1~25.5s. If it is set to 0, it means that scanning time is infinite. It is 5.0s by default1000ms3000ms*5000ms Infinite Non-Scanning IntervalIt is the interval between scanning and detecting. That is module will scan nothing after last scanning for this interval time before and begin its next detecting. The setting range of this interval is 0~25.5s. It is 1.0s by default.No Interval500ms*1000ms1500ms2000msImage stabilization timeIt is the time for module to stabilizing image if brightness changed is detected in sensing mode. The range is 0~25.5s, and 0.4s by default.100ms*400ms1000ms2000msmand ModeIn command mode, scanner will begin scanning after receive the command from MCU. (That is set bit0 to 1 on address 0x0002).Command ModeNote: The scanning command (UART) is that:7E 00 08 01 00 02 01 AB CD. The scanner module will response bytes (02 00 00 01 00 33 31) for the command and begin scanning at the same time.Single Scanning TimeIn command mode, this parameter set the max scanning time for per scanningbehavior. If the module success scanning or the its scanning time reach the max single scanning time, module will enter the non-scanning interval. The range of single scanning time should be 0.1~25.5s. If it is set to 0, it means that scanning time is infinite. It is 5.0s by default.LIGHTING AND TARGETING1. LightingThe white LED provides light for scanning, to improve the scanning performance and supports weak light environments. It has three states for choice:1000ms 3000ms*5000ms infiniteStandard (default): The LED only turn on when scanning, or it keeps off.Keep lighting: The LED will keep lighting after powering on scanner module No light: The LED is turned off all the time.*Standard Keep lighting No light2.TargetingThe targeting light beam could help user to get the best scanning distance and angle. User can set it:Standard (default): The LED only turn on when scanning, or it keeps off.Keep lighting: The LED will keep lighting after powering on scanner module No targeting: The LED is turned off all the time*Standard keep lighting No targetingOUPUT INDICATION1.All warning tonesYou can set the buzzer to active/passive buzzer, as well as setting the drivingfrequency of passive buzzer.Note:LF: Low frequency;MF: Midium frequency;HF: High frequencyIn active driving mode, user can set the working level of buzzer.User can turn off all the warning tones by use the code “Enable silence”.Driving frequency-Passive LF *Driving frequency-Passive MFDriving frequency-Passive HF Driving frequency-Active*Working level-High Working level-LowEnable silence *Disable Silence2. Scanned toneWith these code, you can set the buzzer behavior when succeed in scanning barcode.The time of the warning tone can also be set, it is default 60ms.3. Decoding promptYou can enable this function for MCU to know whether succeed in decoding. After enable this function, module will send prompt character “F” if it failed decoding and “S” if success.*Open Scanned toneClose Scanned tone*Tone time-60msTone time-30ms Tone time-90msTone time-120ms*Don't output decodingpromptOutput decodingprompt4.Keyboard settingTo compatible with different keyboard layout of different countries. There are keyboard setting code for choosing.*Keyboard-US Keyboard-Czech Keyboard-French Keyboard-German Keyboard-Hungarian Keyboard-ItalianKeyboard-Japanese Keyboard-Spanish5.Image flipSometimes we may need to flip the barcode as belowIf your barcode is flipped, you can use the flip mode.Enter flipped mode*Normal mode6.Read version informationYou can read the version information of module with this setting code.Read version informationDATA EDITSometimes we need to edit the scanned data first before output for easily handling.Data edit includes:⚫Add Prefix⚫Add Suffix⚫Decoding Data intercepting⚫Output CodeID of barcode⚫RF information for failed decoding⚫Add terminator TailThe format of Data is as below after edit:【Prefix】【CodeID】【Data】【Suffix】【Tail】1.PrefixAdd prefixProfix is a definable string added in front of decoding data, user can edit it by scanning the related setting codeAllow prefix adding Without prefix Modify prefixY ou can scan “Modify pr e fix” code and data setting code to modify the pr efix.Every character has two HEX and every prefix should less than 16 characters. The Hex of character refer to Appendix DModify prefixExample: Modify the prefix as “DATA”1)Q uery the character table to get the HEX of “DATA” are that : “44”,“41”,”54”, “41”2)Make sure Setting code is enabled, if no, please scanning the setting code“Open Setting Cod e Function”3)S canning “Modify pr e fix”code4)Scanning the data setting code one by one: “4”, “4”, “4”, “1”,“5”, “4”, “4”, “1”5)S canning “Save” Setting code2.SuffixAdd suffixSuffix is definable string added after decoding information.Allow Suffix Adding*Without Suffix Modify SuffixThe suffix can be modified as same as the Prefix.Modify SuffixExample: Modify the Suffix as “DATA”1)Q uery the character table to get the HEX of “DATA” are that : “44”,“41”,”54”, “41”2)Make sure Setting code is enabled, if no, please scanning the setting code“Open Setting Cod e Function”3)S canning “Modify prefix”code4)Scanning the data setting code one by one: “4”, “4”, “4”, “1”,“5”, “4”, “4”, “1”5)S canning “Save” Setting code3.CODE IDAdd CODE IDUser can use CODE ID to identify different type of barcode. CODE ID is chagnable.Every CODE ID has one character.Allow Adding CODE ID*Without CODE IDDefault CODE IDUsing “Default CODE ID” code, the module will restore all barcode information to default code id. The default setting should refer to Appendix CDefault CODE IDChange CODE IDUser can change the Code ID as they want with related setting codes. Every code id has one character (one HEX value). More details about characters, please refer to Appendix DE xample: change the CODE ID of CODE 128 to “A”1)Query the HEX value of “A” is “41”2)Make sure Setting code is enabled, if no, please scanning the setting code“Open Setting Cod e Function”3)S canning setting code “Modify CODE ID of CODE 128”4)S canning data setting codes “4”, ”1”5)S canning setting code “Save”Change CODE ID ListModify CODE ID of EAN 13Modify CODE ID of EAN8Modify CODE ID of UPCA Modify CODE ID of UPCE0 Modify CODE ID of UPCE1Modify CODE ID of CODE 128 Modify CODE ID of CODE 39Modify CODE ID of CODE 93Modify CODE ID of CODE BAR Modify CODE ID of Interleaved2 of 5Modify CODE ID of Industrial 25Modify CODE ID of Matrix 2 of 5Modify CODE ID of CODE 11Modify CODE ID of MSIModify CODE ID of RSS Modify CODE ID ofLimited RSSModify CODE ID of Expanded RSS Modify CODE ID of QR CODEModify CODE ID of Data Matrix Modify CODE ID of Limited PDF4174. TerminatorScanner will output a terminator after succeed in decoding.5. Data segment interceptThe decoding data 【Data 】could be divided to three parts:【Start 】【Center 】【End 】The length of Start and End segments can be set:Close Tail*Add Tail CRAdd Tail TAB Add Tail CRLF*Send whole Data Only Send Start SegmentOnly Send End SegmentOnly Send CenterSegmentChange the Length M of StartWith data setting code and this one, you can change the length of Start segment.The length of Start is max 255 characters.The Length M is represented by a HEX. More details about HEX refer to Appendix DModify the Length MChange the Length N of EndWith data setting code and this one, you can change the length of End segment.The length of Start is max 255 characters.The Length N is represented by a HEX. More details about HEX refer to Appendix DModify the Length NExamples:⚫D ecoding Data: “1234567890123ABC”, output the first thirteen bytes: “1234567890123”(Only Start)1) Query the characters table to get the HEX value of “13”(DEC) is “0D”2) Make sure the setting code function is enable, if not, open it.3) Scanning “Modify the Length M”4) scanning setting co de: “0”, “D”5) Scanning “Save”6) Scanning “Only Send Start Segment”⚫D ecoding Data: “1234567890123ABC”, output the last three bytes: “ABC”(Only End)1) Query characters table, get the HEX value of “3” (DEC) is “03”2) Make sure the setting code function is enable, if not, open it.3) S canning “Modify the length N”4) Scanning setting code: “0”. “3”5) Scanning “Save”6) Scanning “Only Send End Segment”⚫D ecoding Data: “1234567890123ABC”, output the center four bytes “0123”(Only Center)1) Query characters table, get the HEX value of “10” (DEC) and “3” are “0A”and “03” separately2) Make sure the setting code function is enable, if not, open it.3) Scanning “Modify the Length N”4) Scanning setting code: “0”. “3”5) Scanning “Save”7) Scanning setting code “0”, “A”5) Scanning “Save”6) Scanning “Only Send Center Segment”6.RF InformationRF (Read Fail) information is the that used for indicating failed scanning in some modes.Send RF Information*Without RF Information Modify InformationThe RF information can be modified by users. The max length of RF is 15 and every character represented by two HEX values. (Appendix D)Modify RF InformationE xample: Modify the RF information as “FAIL”1)Query characters table to get the HEX values of “FAIL” are “46”, “41”,“49”, “4C”2)Make sure setting code function is enabled, if not, please enable it.4)S canning data setting code: “4”, “6”, “4”, “1”, “4”, “9”, “4”,“C”5)S canning “Save”BARCODE TYPES ENABLE/DIABLE1.All Types EnableWith these setting code, you can enable/disable all types of barcode. If you disable all types of barcode, only the setting code is scannable.Enable All Types Disable All Types*Enable Default Types2.Barcode RotatingYou can enable the function that supports 360° rotation. Disable this function can improve decoding speed.*Enable 360°Rotation Disable 360°Rotation 3.EAN13Enable/Disable ENA13 barcode*Enable Scanning EAN13 Disable Scanning EAN13 4.EAN8Enable/Disable EAN9 barcode*Enable Scanning EAN8Disable Scanning EAN8 5.UPCAEnable/Disable UPCA barcode*Enable Scanning UPCA Disable Scanning UPCA6. UPCE0Enable/Disable UPCE0 barcode7. UPCE1Enable/Disable UPCE1 barcode8. Code128Enable/Disable Code128 barcodeSetting the Min Scannable Length of Code128:*Enable Scanning UPCE0Disable Scanning UPCE0*Enable Scanning UPCE1Disable Scanning UPCE1*Enable Scanning Code128Disable Scanning Code128Code128 Min Length 0 *Code128 Min Length 4Setting the Max scannable length of Code128:*Code128 Max Length 32Code128 Max Length 255 9.Code 39Enable/Disable Code39*Enable Scanning Code39Disable Scanning Code39 Setting the Min scannable length of Code39:Code39 Min Length 0*Code39 Min Length 4 Setting the Max Scannable length of Code39:*Code39 Max Length 32Code39 Max Length 255 10.Code93Enable/Disable Code93 barcode*Enable Scanning Code93Disable Scanning Code93 Setting the Min scannable length of Code93:Code93 Min Length 0*Code93 Min Length 4 Setting the Max scannable length of Code93:*Code93 Max Length 32Code93 Max Length 255 11.Code BarEnable/Disable Code Bar barcode*Enable Scanning Code Bar Disable Scanning Code BarSetting Start/Stop characters of Code Bar:Setting the min scannable length of Bar CodeSetting the max scannable length of Bar Code12. QREnable/Disable QR code13. Interleaved 2 of 5Enable/Disable Interleaved 2 of 5 codeSend Code Bar Start/StopCharacter*Without Code Bar Start/StopCharacterCode Bar Min Length 0*Code Bar Min Length 4*Code Bar Max Length 32 Code Bar Max Length 255*Enable Scanning QRDisable Scanning QREnable Scanning Interleaved 2 of 5*Disable Scanning Interleaved 2 of 5 Setting the min scannable length of Interleaved 2 of 5 code:Interleaved 2 of 5 Min Lenght 0* Interleaved 2 of 5 Max Length 4 Setting the max scannable length of interleaved 2 of 5 code:* Interleaved 2 of 5 Min Length 32Interleaved 2 of 5 Max Length 255 14.Industrial 25Enable/Disable Industrial 25 codeEnable Scanning Industrial 25*Disable Scanning Industrial 25 Setting the min scannable length of Industrial 25Industrial 25 Min Lenght 0* Industrial 25 max Length 4 Setting the max scannable length of Industrial 25:* Industrial 25 Max Lenght 32Industrial 25 Max Length 255 15.Matrix 2 of 5Enable/Disable scanning Matrix 2 of 5 code:Enable Scanning Matrix 2 of 5*Disable Scanning Matrix 2 of 5 Setting the min scannable length of Matrix 2 of 5Matrix 2 of 5 Min Length 0* Matrix 2 of 5 Min Length 4Setting the max scannable length of Matrix 2 of 5* Matrix 2 of 5 Max Length 32Matrix 2 of 5 Max Length 255 16.Code11Enable/Disable Scanning Code11Enable Scanning Code11*Disable Scanning Code11 Setting the min scannable length of Code11:Code11 Min Length 0*Code11 Min Length 4 Setting the max scannable length of Code11:*Code11 Max Length 32Code11 Max Length 25517. MSIEnable/Disable scanning MSI codeSetting the min scannable length of MSI:Setting the max scannable length of MSI:18. RSSEnable/Disable scanning RSS-14Enable Scanning MSI*Disable Scannig MSIMSI Min Length 0*MSI Min Length 4* MSI Max Length 32 MSI Max Length 255Enable Scanning RSS-14*Disable Scanning RSS-14Enable/Disable scanning Limited RSSEnable Scanning Limited RSS*Disable Scanning Limited RSS Enable/Disable scanning Expanded RSSEnable Scanning Expanded RSS*Disable Scanning Expanded RSS Setting the min scannable length of RSSRSS Min Length 0*RSS Min Length 4 Setting the max scannable length of RSS* RSS Max Length 32RSS Max Length 255 19.DMEnable/Disable Scanning DM code20.PDF417Enable/Disable scanning PDF417 code:APPENDIX A: DEFAULT SETTING TABLEParameters Default Setting Note Communicating InterfaceUARTBaud rate 9600Parity NoneData bit 8Stop bit 1Flow control None*Enable Scanning DM Disable Scanning DM *Enable Scanning PDF417Disable Scanning PDF417APPENDIX B: COMMON UART COMMANDAfter sending the query command of baud rate, the module will response as below:Note: SS SS is checksumAPPENDIX C: CODE ID LISTAPPENDIX D: ASCII TABLE。
c zxing 例子
c zxing 例子
ZXing是一个用Java编写的开源条形码/二维码扫描库,它提供了丰富的功能和灵活的API,可以用于在移动设备和桌面应用程序中实现条形码和二维码的扫描和生成。
下面我会给出一些关于ZXing的例子:
1. 扫描条形码/二维码,使用ZXing库可以轻松实现在移动设备上扫描条形码和二维码的功能。
开发人员可以通过调用库中提供的方法,实现相机的调用和扫描结果的处理,从而实现扫描功能。
2. 生成二维码,ZXing库提供了生成二维码的功能,开发人员可以根据自己的需求,调用库中的方法,传入相应的参数,生成自定义内容的二维码图片。
3. 解析条形码/二维码,使用ZXing库可以轻松实现对条形码和二维码的解析功能,开发人员可以通过调用库中提供的方法,对扫描到的条形码和二维码进行解析,获取其中的信息。
4. 自定义扫描界面,ZXing库提供了丰富的API和样式定制功能,开发人员可以根据自己的需求,自定义扫描界面的样式和交互
逻辑,从而实现个性化的扫描界面。
5. 集成ZXing库到应用程序中,开发人员可以通过引入ZXing 库的依赖,或者直接将库的源代码集成到自己的应用程序中,从而实现条形码和二维码相关功能的集成。
总之,ZXing库提供了丰富的功能和灵活的API,可以帮助开发人员轻松实现条形码和二维码的扫描、生成和解析功能,并且提供了样式定制和个性化定制的能力,非常适合在移动设备和桌面应用程序中使用。
QT编程下条码扫描器的实现
QT编程下条码扫描器的实现在凌动嵌入式系统UP-ATOM510平台上,结合LS1902系列手持激光条码扫描器,实现了QT集成开发环境下条码扫描器的应用。
标签:凌动嵌入式系统;QT编程;LS1902条码扫描器引言条形码技术具有输入速度快、采集信息量大、制作使用成本低廉等优点,并被认为是目前最经济实用的自动识别技术之一[1]。
它广泛应用在工商业、仓储物流、交通运输、医疗卫生等领域。
文章在UP-ATOM510嵌入式平台上实现了LS1902系列手持激光条码扫描器的应用,并利用QT实现了界面设计。
1 系统开发环境1.1 QT软件开发环境QT是一种跨平台图形用户界面开发库,和同类型的其他产品相比,它具有优良的跨平台特性、高度的模块化、支持2D/3D图形渲染,并且允许真正地组件编程等优良特性。
因此,可以说QT提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。
1.2 UP-ATOM510硬件平台UP-Atom510采用凌动Z系列处理器搭配Intel us15w单芯片系统控制器,功耗远远低于传统的x86双桥片架构,而且保持X86的兼容性,其操作系统采用以桌面应用为主的Ubuntu操作系统[2]。
1.3 LS1902条码扫描器LS1902系列手持激光条码扫描器是Symbol公司制造的新一代的商用激光条码扫描器。
它扫描线清晰可见,扫描速度达到每秒44次,并且价格适中。
同时,具有RS232,USB 等多种接口,有利于主机扩展设备。
2 QT图形界面设计及初始化本设计涉及到存储的项目有条码号、商品名称、单价、数量这四项,所以要预设settings.txt存储格式。
然后,建立QT工程文件Widget并进行UI界面设计,设计界面如1所示。
图1 条码扫描系统QT界面程序在使用过程中读取到条码号之后,需要将条码号及相关信息保存,这需要建立一个配置文件来进行保存。
QT提供的bool QFile::open(Open Mode mode)[virtual]的函数可以完成此功能。
vndetectbarcodesrequest oc代码
vndetectbarcodesrequest oc代码以下是一篇关于vndetectbarcodesrequest oc代码的文章:标题:详解vndetectbarcodesrequest oc代码:使用步骤和实用技巧引言:在现代社会中,激光扫描仪和数字相机已广泛应用于条形码和二维码的扫描。
在移动应用程序开发中,通过使用合适的API,可以很容易地实现条形码和二维码的识别功能。
VNBarcodeScannerKit是一个开源的Objective-C库,它提供了一种简单有效的方式来处理条形码和二维码的扫描。
本文将一步一步回答关于vndetectbarcodesrequest oc代码的使用方法,并分享一些实用技巧。
正文:第一步:安装VNBarcodeScannerKit库在开始使用vndetectbarcodesrequest oc代码之前,我们需要先安装VNBarcodeScannerKit库。
可以通过CocoaPods或手动下载并添加库文件到项目中进行安装。
确保在项目对应的Podfile文件中添加了`pod 'VNBarcodeScannerKit'`,然后执行`pod install`命令安装该库。
第二步:导入VNBarcodeScannerKit库安装完成后,我们需要在我们的OC代码中导入VNBarcodeScannerKit 库。
可以通过添加`#import<VNBarcodeScannerKit/VNBarcodeScannerKit.h>`语句来实现。
第三步:创建VNBarcodeScannerViewController实例现在我们可以创建一个VNBarcodeScannerViewController实例,并将其添加到现有的视图层次结构中。
代码如下:VNBarcodeScannerViewController *scannerViewController = [[VNBarcodeScannerViewController alloc] init];[self addChildViewController:scannerViewController];[self.view addSubview:scannerViewController.view]; scannerViewController.view.frame = self.view.bounds; [scannerViewController didMoveToParentViewController:self];第四步:实现VNBarcodeScannerViewControllerDelegate协议在我们的OC代码中,我们需要实现VNBarcodeScannerViewControllerDelegate协议,以便在扫描到条形码或二维码时进行相应的处理。
条码扫描仪设置方法
条码扫描仪设置方法第一步:打开设置软件Metrologic.第二步:打开Industrial Scanners(工业扫描器),双击Holotrak(全息解码技术)进入软件。
第三步:双击Com Ports(COM端口)设置COM口。
第四步:设置条码,目前是两种条码。
(1)、I2of5:勾选Enable Interleaved(开启交叉二五码)。
更改Lock1值为8,Lock2值为2 。
(2)、Code 128:勾选Enable Code128(启用Code128码)。
第五步:双击Misc/Code Length(杂项/代码长度),勾选Enable segmented decoding(启用分段解码)。
设置Min值为2,设置Lock值为0。
第六步:双击Reserved Codes(保留的代码)。
勾选使用的程序Reserve Code5(储备代码5)和Infinite same symbol timeout[7](无限相同的符号超时[7])。
双击Misc,设置Redundancy Count(冗余数)为5,Custom Configuration byte(自定义配置字节)为0。
如果使用控制盒,则要设置如下:打开Industrial Options(工业选项),双击Line Sensor(线传感器)。
设置Scans per Activation(扫描每激活)为3,Scanner activation time (扫描器激活时间)为3.0。
勾选Support package detect(支持包检测),and Scan duration time(扫描持续时间),and Transmit no read message (传输没有读消息),and Buffer all scans until cycle completes(缓冲直到周期完成所有扫描)。
控制器型号:MX001连接线:MX001-IS8550光电开头:NPN /PNP其中一种。
二维条码扫描枪的串口模式应该如何的设置
注意事项:
而运行数据转换软件的时候,所需要确定的 串口名称检测方法,大家可以通过鼠标右击电脑 桌面上面的“我的电脑”图标,然后在右键菜单 中选择“属性”之后调出“设备管理器”来检测 相对应的串口名称,具体如何操作,大家可以通 过上网查询,这边就不做详细描述了。
结 语: 各位读者朋友们看完小编这两篇文 章来详细解读超市收银条码扫描平台应 该如何设置的方法之后,大家是不是已 经有了进一步的了解呢。 其实设置方法很简单的哦,各位操 作者只要按照步骤规范的操作即可哦~如 果您还没有掌握的话,可以实际去操作 下,因为纸上谈兵终觉浅,实际演练才 是王道哦^~^
超市条码扫描枪的串口模式应 该如何的设朋友们大家好,不知道 大家是否还记得扫描网小编之前有一篇文章 为大家介绍了关于超市收银条码扫描平台的 接口介绍和应该如何操作的文章吗?当时小 编在那篇文章中为大家介绍了三中接口方式 的设置方法,但却很坏的最后留下一个小悬 念,也就是关于RS232接口(串口)的设置 方法之教给了大家其中一种。今天小编良心 发现,终于要在开稿为各位介绍另外一种啦, 大家赶紧搬好小板凳听讲解吧。
设置方法:第二步
当您有了转换器之后,就可以进入以下的操作啦。首先, 请先将条码扫描平台连接在转换器的一端,并将转换器的另 外一端与电脑上面的USB接口相连,连接好以后,系统会提 示您安装驱动,这个时候我们前面购买时索要的驱动软件就 可以派上用场了,安装成功之后就可实现串口到USB接口的 转换了。很多读者朋友们看到这里就会以为条码扫描平台已 经可以正常使用了。其实并不是,因为我们前面的那些操作 只是为电脑增加了一个串口的功能而已,所以这个时候我们 就得用到文章开头中的所提到的那篇文章《超市收银条码扫 描平台具体应该要如何操作呢?》里面介绍RS232接口(串 口)设置方法时所提到的那个能够把串口转换为键盘数据的 软件了。只有运行那个软件之后,才能够最终实现扫描功能 哦。
条码扫描器说明书
如何正确使用条码扫描器:1、条码扫描器和条码保持一定的倾角,以达到最佳效果。
2、条码扫描器和条码间的角度不能为 90 度,否则不能正常读码。
3、务必让条码被完整扫描,确定扫描器能正确扫读。
介绍说明:该条码扫读设备为计算机信息系统提供精确,易用和快速的数据录入和存入的完备的解决方案。
本产品提供完整的接口方式以适应各类主机的计算机系统包括:KeyboardWandRS-232Dual RS-232USB OTHERS所有译码器的参数设定都可通条码的扫描来完成,并保存在存储记忆体中,在关闭电源后仍保留设置。
产品各项功能未全部在本手册中列出,请您与供应商联系以获得更多详细资料。
所有权利,包括本说明手册最终解释权由本公司保留。
目录自动感应条码扫描器使用说明 (4)扫描功能 (5)输出模式 (5)蜂鸣器 (5)条码正反图像设定 (6)添加条码ID(条码辨别号) (6)条码读取触发模式 (6)键盘接口 (7)PC传输模式 (7)键盘传送速度 (7)世界各国键盘语言 (7)RS-232接口 (8)波特率 (8)握手协议 (8)数据位 (9)停止位 (9)校验位 (9)光笔接口 (10)传送速度 (10)条码正反图像设定 (10)条形码开启与关闭 (10)Code11 (10)Code39 (10)Code93 (11)Code128 (11)Code bar (11)交叉25码 (11)工业25码 (11)MSI/Plessey (12)UPC/EAN (12)条形码符号设定 (13)Code11 (13)Code39 (13)Code93 (14)Code128 (14)Code bar (14)交叉25码 (15)工业25码 (15)MSI/Plessey (16)UPC/EAN (16)编辑设定条形码 (19)条码字符一般/特别设定 (20)条形码末端字符设定 (21)使用高级设定模式设置条码阅读器 (22)设置种类 (23)编辑键值 (24)选项编号和描述 (25)F1-接口选项 (25)F2-Code39选项 (25)F2-UPC/EAN选项 (26)F2-UPC/EAN补充选项 (26)F2-Code93选项 (27)F2-Code128选项 (27)F2-CodeBar选项 (27)F2-交叉25码选项 (28)F2-工业25码选项 (28)F2-MSI选项 (28)F2-Code11选项 (29)F2-激光器/CCD选项 (29)F2-其它译码选项 (29)F2-定义蜂鸣器和LED选项 (29)F4-定义一般按键区表选项 (30)F3-条码编辑设定 (31)F4-格式组合设定码 (32)F5-字符串设定码 (33)附录-A 特殊字符和ALT组合键表格 (34)附录-B ALT组合键的表格 (35)附录-C 故障问题及解决方案 (36)自动感应条码扫描器使用说明:1、自动感应条码扫描器通电时默认为自动感应模式。
C#实现简单获取扫码枪信息代码
C#实现简单获取扫码枪信息代码⼀个扫码枪遵循TCP协议,通过改代码即可获取扫码枪所扫描的信息;(有⼀个串⼝服务器);using System;using System.Collections.Generic;using System.Linq;using System.Text;using ;using .Sockets;using System.Threading;using System.Diagnostics;using ;namespace Demo_Net{//本机为服务端//下午加⼀个判断⽹络是否连接;以及做出相应的判断;class Program{static Socket msock;static void Main(string[] args){//先判断是否ping通:string ips = "10.18.14.111";string str = NetConnect(ips);Console.WriteLine(str);Console.ReadLine();}//通过ping的⽅法判断是否连接;private static string NetConnect(string ip){Process p = new Process();p.StartInfo.FileName = "cmd.exe";eShellExecute = false;p.StartInfo.RedirectStandardError = true;p.StartInfo.RedirectStandardInput = true;p.StartInfo.RedirectStandardOutput = true;p.StartInfo.CreateNoWindow = false;string pingstr;p.Start();p.StandardInput.WriteLine("ping -n 1 " + ip);p.StandardInput.WriteLine("exit");string strRst = p.StandardOutput.ReadToEnd();if (strRst.IndexOf("(0% 丢失)") != -1){pingstr = "连接成功";//定义socket连接需要的本机ip以及相应的端⼝;msock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);var localIP = new IPEndPoint(IPAddress.Parse("10.18.14.23"), 10001);msock.Bind(localIP);//⾃⼰定义最⼤⽹络连接数msock.Listen(10);//新建线程处理;Thread th = new Thread(delegate(){Rec();});th.IsBackground = true;th.Start();}else{pingstr = "连接超时";}p.Close();return pingstr;}//监听是否有链接,新开线程处理static void Rec(){do{Socket s = msock.Accept();Thread th = new Thread(delegate() {Parse(s);});th.IsBackground = true;th.Start();} while (true);}//有链接时处理获取的信息static void Parse(Socket s){do{byte[] b = new byte[1000];int l = s.Receive(b);b = b.Take(l).ToArray();string rs = string.Empty;for (int i = 0; i < b.Length; i++){rs = rs + b[i].ToString();}//解码Console.WriteLine(Encoding.ASCII.GetString(b, 0, l)); } while (true);}}}。
Honeywell条码扫描枪入门指南
VG-ECL-SC-QS 版本 C6/12Voyager 9520/40Voyager GS9590Eclipse 5145快速入门指南入门指南连接扫描枪之前请关闭计算机电源,然后在扫描枪完全连接后打开计算机电源。
连接扫描枪USB:键盘口:可选适配器电缆读取技巧调用默认值扫描启用出厂默认值,然后扫描恢复默认值以重置所有标准产品默认设置。
调用默认值接口选择USB键盘口OEM默认值键盘的国家/地区设置扫描条码,选择下面的某个键盘国家/地区设置模板。
有关其他的键盘国家/地区设置,请参阅《配置指南》。
ALT 模式注:在扫描适当的键盘国家 / 地区代码后,扫描“ALT 模式”。
如果条码中包含扩展 ASCII 码表的特殊字符,例如带重音符的 e (è),请扫描“ALT 模式开启”条码。
随即便会输出带特殊字符的数据。
RS232通信命令开启扫描下列某个条码,将您的扫描枪设为在每个条码前添加或删除文本开始符或者 AIM 、NCR 或 Nixdorf 标识符。
扫描下列某个条码,将您的扫描枪设为在每个条码后添加或删除回车符、换行、制表符或者文本结束符。
用户可配置的前缀/后缀进行数据传输时可以添加或指派一个或两个前缀或后缀。
对于前缀和后缀,请使用下面带 3 代码字节序列的某个代码(代表所需字符)(请参见ASCII 转换图,下页)。
(要添加其他前缀/后缀字符,请参阅《single-line configuration guide 》。
) 扫描“进入/退出编程”条码,即可开始。
随后将 ASCII 字符的十进制等值3位数扫描到带代码字节条码的适当字符位置(请参见代码字节,下页)。
若要保存,请再次扫描“进入/退出编程”条码。
示例:要添加星号 (*) 作为前缀,请扫描条码:1.进入/退出编程2.可配置的前缀 #13.代码字节 04.代码字节 45.代码字节 26.进入/退出编程补码请扫描下面某个条码,为您的扫描枪编程 2 位或 5 位条码补码。
条码扫描器常见多种设置方法
条码扫描器常见多种设置方法条码扫描器设置包括条码扫描器的恢复出厂设置,条码数据的前缀和后缀添加设置,条码数据的位数截取设置,条码扫描器串口通讯产数设置,条码扫描器扫描模式设置,条码扫描器码制开通设置等等,了解条码扫描器的一些基本设置能够帮助我们解决一些扫描器故障。
条码扫描器常见多种设置方法1 恢复出厂设置恢复出厂设置的方法可以解决条码扫描器一般出现的故障,如:扫描器无法识读条码标签,恢复出厂是条码扫描器设置中最重要的一个设置。
一般扫描器说明书上面会有详细解释。
1)Set Defaults 或Set All Defaults2)Recall Defaults 3)Standard Product Default Settings 这些英文表示的就是扫描器恢复出厂设置。
2 条码数据的前缀和后缀添加设置和位数截取设置条码扫描器前缀和后缀的添加和条码数据删除是为了适应一个新的系统的一些功能,新系统的功能有时会出现和扫描器不兼容的现象,这个时候我们就需要使用条码数据添加和删除功能来实现兼容。
3 条码扫描器串口通讯参数设置和扫描模式设置条码扫描器波特率、奇偶校验、停止位、数据位、握手协议等都是通过扫描器串口通讯参数设置来实现的。
条码扫描器扫描模式有多种,手动按键式扫描、自感条码式扫描、光线闪烁式扫描、光线常亮式扫描,通过扫描模式的设置可以方便的在任意两种模式中进行切换操作。
4 条码扫描器码制开通设置和扫描器接口类型设置条码扫描器有时候会出现无法扫描识读的现象,这是因为一下不常用的条形码码制一般都会锁定,为了提高条码扫描器的性能和编码速度,默认情况下条码扫描器是无法识读的,我们可以通过码制开通设置来开通。
条码扫描器接口类型设置可以方便用户进行接口模式的转换设置,这样扫描器就能在其他接口模式下正常工作。
5 条码扫描器蜂鸣器设置扫描器蜂鸣器的设置也许容易被广大用户所忽视,对于它的设置用户更是一点都不了解,而且也不知道出现什么样的问题和故障是需要进行扫描器蜂鸣器的设置。
精锐扫描枪SL4000手册
25
50
75
键键键键设设
美语
德语
法语
通用语言
5
波波波
2400
4800
9600
19200
握握握握握握
无
XON/OFF
RTS/CTS
ACK/NAK
数数停握握
8
7
停停停握握
1
2
6
校校校校校
无
奇
偶
复位校验位
字字字字字校校
0秒
20
30
50
响响字字校校
2毫秒
5毫秒
STX/ETX
STX
ETX
7
CODE39
打开
主要性能参数
1.扫描速度 76线/秒 2.解析度:(pcs0.9) 0.10mm(4mil) 3.景深 1-60cm(PCS0.9) 4.可读条码种类 CODE39; 工业二五码; 交错二五码; 中国邮政码; CODE93; UPC/EAN/JAN; Code 128; ISBN;CODE11;MSI 5.扫描触发方式:手动 自动 6.支持界面 RS232;KB ;USB;RS485 7.操作温度 0-40°c 8.储存温度 -30-60°c 9.储存湿度5-95% 10.冲击测试 2m 自由落体 11.受光强度 日光 3.000lux max 12.安全镭射级:激光一极标准. 13.材质 ABS PS 14.电源 5v
2
出厂参数表
接口 波特率 数据位 停止位 奇偶校验 握手信号 条码类型 CODE39 UPCA UPCE
键盘 9600 8 1 无 无 条码开关 校验 开 开 开 开 关闭 开 开 不计算 不计算 不计算 不计算 不计算 不发送 不发送 不发送 不发送 不发送 1 1 2 4 1 3 2 164 81 49 100 2 63 83
条形码扫描原理和编码规则
条形码扫描原理和编码规则条形码的扫描需要扫描器,扫描器利用自身光源照射条形码,再利用光电转换器接受反射的光线,将反射光线的明暗转换成数字信号。
不论是采取何种规则印制的条形码,都由静区、起始字符、数据字符与终止字符组成。
有些条码在数据字符与终止字符之间还有校验字符。
▲静区:静区也叫空白区,分为左空白区和右空白区,左空白区是让扫描设备做好扫描准备,右空白区是保证扫描设备正确识别条码的结束标记。
为了防止左右空白区(静区)在印刷排版时被无意中占用,可在空白区加印一个符号(左侧没有数字时印<:号,右侧没有数字时加印>;号)这个符号就叫静区标记。
主要作用就是防止静区宽度不足。
只要静区宽度能保证,有没有这个符号都不影响条码的识别。
▲起始字符:第一位字符,具有特殊结构,当扫描器读取到该字符时,便开始正式读取代码了。
▲数据字符:条形码的主要内容。
▲校验字符:检验读取到的数据是否正确。
不同编码规则可能会有不同的校验规则。
▲终止字符:最后一位字符,一样具有特殊结构,用于告知代码扫描完毕,同时还起到只是进行校验计算的作用。
为了方便双向扫描,起止字符具有不对称结构。
因此扫描器扫描时可以自动对条码信息重新排列。
条码扫描器有光笔、CCD.激光、影像四种▲光笔:最原始的扫描方式,需要手动移动光笔,并且还要与条形码接触。
ACCD:以CCD作为光电转换器,1ED作为发光光源的扫描器。
在一定范围内,可以实现自动扫描。
并且可以阅读各种材料、不平表面上的条码,成本也较为低廉。
但是与激光式相比,扫描距离较短。
▲激光:以激光作为发光源的扫描器。
又可分为线型、全角度等几种。
▲影像:以光源拍照利用自带硬解码板解码,通常影像扫描可以同时扫描一维及二维条码,如新大陆引擎及Honeywe11引擎。
线型:多用于手持式扫描器,范围远,准确性高。
全角度:多为工业级固定式扫描,自动化程度高,在各种方向上都可以自动读取条码及输出电平信号,结合传感器使用。
编码规则唯一性:同种规格同种产品对应同一个产品代码,同种产品不同规格应对应不同的产品代码。
多种方式C#实现生成(条码二维码)
多种⽅式C#实现⽣成(条码⼆维码)C#通过第三⽅组件⽣成⼆维码(QR Code)和条形码(Bar Code)⽤C#如何⽣成⼆维码,我们可以通过现有的第三⽅dll直接来实现,下⾯列出⼏种不同的⽣成⽅法:1):通过QrCodeNet(Gma.QrCodeNet.Encoding.dll)来实现1.1):⾸先通过VS2015的NuGet下载对应的第三⽅组件,如下图所⽰:1.2):具体⽣成⼆维码⽅法如下private void GenerateQRByQrCodeNet(){QrEncoder qrEncoder = new QrEncoder(ErrorCorrectionLevel.H);QrCode qrCode = new QrCode();qrEncoder.TryEncode("Hello World. This is Eric Sun Testing...", out qrCode);GraphicsRenderer renderer = new GraphicsRenderer(new FixedModuleSize(5, QuietZoneModules.Two), Brushes.Black, Brushes.White);using (MemoryStream ms = new MemoryStream()){renderer.WriteToStream(qrCode.Matrix, ImageFormat.Png, ms);Image img = Image.FromStream(ms);img.Save("E:/csharp-qrcode-net.png");}}更多详细信息请参考如下链接:2):通过ThoughtWorks.QRCode(ThoughtWorks.QRCode.dll)来实现1.1):⾸先通过VS2015的NuGet下载对应的第三⽅组件,如下图所⽰:1.2):具体⽣成⼆维码⽅法如下private void GenerateQRByThoughtWorks(){QRCodeEncoder encoder = new QRCodeEncoder();encoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//编码⽅式(注意:BYTE能⽀持中⽂,ALPHA_NUMERIC扫描出来的都是数字) encoder.QRCodeScale = 4;//⼤⼩(值越⼤⽣成的⼆维码图⽚像素越⾼)encoder.QRCodeVersion = 0;//版本(注意:设置为0主要是防⽌编码的字符串太长时发⽣错误)encoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//错误效验、错误更正(有4个等级)encoder.QRCodeBackgroundColor = Color.Yellow;encoder.QRCodeForegroundColor = Color.Green;string qrdata = "Hello 世界! This is Eric Sun Testing....";Bitmap bcodeBitmap = encoder.Encode(qrdata.ToString());bcodeBitmap.Save(@"E:\HelloWorld.png", ImageFormat.Png);bcodeBitmap.Dispose();}3):通过Spire.BarCode(Spire.BarCode.dll)来实现1.1):⾸先通过VS2015的NuGet下载对应的第三⽅组件,如下图所⽰:1.2):具体⽣成⼆维码⽅法如下private void GenerateQRBySpire(){BarcodeSettings bs = new BarcodeSettings(){Data = "This is qr code: H2AMK-Z3V69-RTJZD-C7JAU-WILL4",Type = BarCodeType.QRCode,TopTextColor = Color.Red,ShowCheckSumChar = false,ShowText = false};//Generate the barcode based on the this.barCodeControl1BarCodeGenerator generator = new BarCodeGenerator(bs);Image barcode = generator.GenerateImage();//save the barcode as an imagebarcode.Save(@"E:\barcode-2d.png");}1.3):附加具体⽣成条形码⽅法如下private void GenerateBarCodeBySpire(){BarcodeSettings bs = new BarcodeSettings(){Data = "This is barcode: H2AMK-Z3V69-RTJZD-C7JAU-WILL4",ShowCheckSumChar = false,TopTextColor = Color.Red,ShowTopText = false,ShowTextOnBottom = true};//Generate the barcode based on the this.barCodeControl1BarCodeGenerator generator = new BarCodeGenerator(bs);Image barcode = generator.GenerateImage();//save the barcode as an imagebarcode.Save(@"E:\barcode.png");}1.3):上诉代码我们发现⽣成的条形码和⼆维码带有⽔印[E-ICEBLUE],如何去除⽔印呢?请看如下代码BarcodeSettings.ApplyKey("......");请发送邮件到 sales@ 免费获取对应的 key 值更多详细信息请参考如下链接:4):通过Barcode Rendering Framework(Zen.Barcode.Rendering.Framework.dll)来实现4.1):⾸先通过VS2015的NuGet下载对应的第三⽅组件,如下图所⽰:4.2):具体⽣成⼆维码⽅法如下private void GenerateBarCodeByZen(){Code128BarcodeDraw barcode128 = BarcodeDrawFactory.Code128WithChecksum;Image img = barcode128.Draw("Hello World", 40);img.Save("E:/zenbarcode.gif");}4.3):附加具体⽣成条形码⽅法如下private void GenerateQRByZen(){CodeQrBarcodeDraw qrcode = BarcodeDrawFactory.CodeQr;Image img = qrcode.Draw("Hello World!", qrcode.GetDefaultMetrics(40));img.Save("E:/zenqrcode.gif");}更多详细信息请参考如下链接:5.1):具体⽣成⼆维码⽅法如下private void GenerateQRByBarcodeLib(){QRCode qrbarcode = new QRCode();qrbarcode.Encoding = QRCodeEncoding.Auto;qrbarcode.Data = "336699885522 This is Eric Sun Testing.";qrbarcode.ModuleSize = 10;qrbarcode.LeftMargin = 8;qrbarcode.RightMargin = 8;qrbarcode.TopMargin = 8;qrbarcode.BottomMargin = 8;qrbarcode.ImageFormat = System.Drawing.Imaging.ImageFormat.Gif;// Save QR Code barcode image into your systemqrbarcode.drawBarcode("E:/csharp-qrcode-lib.gif");}5.2):附加具体⽣成条形码⽅法如下private void GenerateLinearByBarcodeLib(){Linear barcode = new Linear();barcode.Type = BarcodeType.CODE128;barcode.Data = "CODE128";// other barcode settings.// save barcode image into your systembarcode.drawBarcode("E:/barcode.png");}我们使⽤的是试⽤版(带⽔印的......),还有付费的正版,详情请参考如下链接:======================================================================================= Net Core ⽣成⼆维码⼀维码⼆维码包⽣成⼆维码帮助类public interface IQRCodeMoons: ISingletonDependency{Bitmap GetQRCode(string data, int pixel);byte[] GetQrCodeByteArray(string data, int pixel = 4);}///<summary>///⼆维码///</summary>public class QRCodeMoons: IQRCodeMoons{///<summary>///⽣成⼆维码///</summary>///<param name="url">存储内容</param>///<param name="pixel">像素⼤⼩</param>///<returns></returns>public Bitmap GetQRCode(string data, int pixel){QRCodeGenerator generator = new QRCodeGenerator();QRCodeData codeData = generator.CreateQrCode(data, QRCodeGenerator.ECCLevel.M, true);QRCoder.QRCode qrcode = new QRCoder.QRCode(codeData);Bitmap qrImage = qrcode.GetGraphic(pixel, Color.Black, Color.White, true);return qrImage;}///<summary>///⽣成⼆维码并转成字节///</summary>///<param name="data"></param>///<param name="pixel"></param>///<returns></returns>public byte[] GetQrCodeByteArray(string data, int pixel = 4){var bitmap = GetQRCode(data, pixel);using (MemoryStream ms = new MemoryStream()){bitmap.Save(ms, ImageFormat.Jpeg);return ms.GetBuffer();}}}直接把byte[] 字节返回给前端前端通过img标签加载⼆维码<img "data:;base64,"+⼆维码字节数组 />前端通过img标签加载字节中的图⽚1.在angular中直接这样通过img加载会报错提⽰不安全的url 需要对这个url进⾏消毒进⾏安全监测 注⼊消毒对象private sanitizer: DomSanitizer 对当前地址进⾏消毒通过[src] 属性绑定的⽅式不能通过src='{{}}'这种⽅式绑定值如果对html本⽂进⾏绑定也需要通过bypassSecurityTrustHtml进⾏消毒this.imageByte= this.sanitizer.bypassSecurityTrustResourceUrl("data:;base64,"+result.qrCode)<img *ngIf="data" [src]="imageByte" />2.可以通过div 设置背景图⽚的⽅式避开这个问题但是调⽤js打印的时候⽆法加载背景图⽚<div [ngStyle]="{'background-image':'url(data:;base64,'+data.qrCode+')'}"></div><img width="75px" src="data:;base64,{{data.qrCode}}" />⼀维码包⽣成⼀维码帮助类public interface IBarCodeMoons : ISingletonDependency{Image GetBarCode(string data);byte[] GetBarCodeByteArray(string data);}///<summary>///⼀维码///</summary>public class BarCodeMoons: IBarCodeMoons{///<summary>///⽣成⼀维码///</summary>///<param name="data">存储内容</param>///<returns></returns>public Image GetBarCode(string data){BarcodeLib.Barcode b = new BarcodeLib.Barcode();Image img = b.Encode(BarcodeLib.TYPE.CODE128, data, Color.Black, Color.White, 290, 120);return img;}///<summary>///⽣成⼀维码并转成字节///</summary>///<param name="data"></param>///<returns></returns>public byte[] GetBarCodeByteArray(string data){var img = GetBarCode(data);using (MemoryStream ms = new MemoryStream()){img.Save(ms, ImageFormat.Jpeg);return ms.GetBuffer();}}}=======================================================================================C# 利⽤BarcodeLib.dll⽣成条形码(⼀维,zxing,QrCodeNet/dll⼆维码)⾸先效果:1.BarcodeLib.dll ⼀维条码库⽀持以下条码格式UPC-AUPC-EUPC 2 Digit Ext.UPC 5 Digit Ext.EAN-13JAN-13EAN-8ITF-14CodabarPostNetBookland/ISBNCode 11Code 39Code 39 ExtendedCode 93LOGMARSMSIInterleaved 2 of 5Standard 2 of 5Code 128Code 128-ACode 128-BCode 128-CTelepen然后项⽬中添加引⽤1.private void button6_Click(object sender, EventArgs e)2.{3.System.Drawing.Image image;4.int width = 148, height = 55;5.string fileSavePath = AppDomain.CurrentDomain.BaseDirectory + "BarcodePattern.jpg";6.if (File.Exists(fileSavePath))7.File.Delete(fileSavePath);8.GetBarcode(height, width, BarcodeLib.TYPE.CODE128, "20131025-136", out image, fileSavePath);9.10.pictureBox1.Image = Image.FromFile("BarcodePattern.jpg");11.}12.public static void GetBarcode(int height, int width, BarcodeLib.TYPE type, string code, out System.Drawing.Image image, string fileSaveUrl)13.{14.try15.{16.image = null;17.BarcodeLib.Barcode b = new BarcodeLib.Barcode();18.b.BackColor = System.Drawing.Color.White;//图⽚背景颜⾊19.b.ForeColor = System.Drawing.Color.Black;//条码颜⾊20.b.IncludeLabel = true;21.b.Alignment = BarcodeLib.AlignmentPositions.LEFT;22.belPosition = belPositions.BOTTOMCENTER;23.b.ImageFormat = System.Drawing.Imaging.ImageFormat.Jpeg;//图⽚格式24.System.Drawing.Font font = new System.Drawing.Font("verdana", 10f);//字体设置25.belFont = font;26.b.Height = height;//图⽚⾼度设置(px单位)27.b.Width = width;//图⽚宽度设置(px单位)29.image = b.Encode(type, code);//⽣成图⽚30.image.Save(fileSaveUrl, System.Drawing.Imaging.ImageFormat.Jpeg);31.32.}33.catch (Exception ex)34.{35.36.image = null;37.}38.}ZXing (ZebraCrossing)是⼀个开源的,⽀持多种格式的条形码图像处理库,。
霍尼韦尔XENON ULTRA 1962G无线条码扫描器说明书
增强的扫描性能,甚至可读取破损和低印刷质量的条码,不受任何呈现方式影响,从而缩短每次零售交易的时间浪费。
所有型号均采用耐消毒液外壳,可使用各种清洗溶液定期清洁而不会损坏产品。
关于可用清洁剂,请参阅霍尼韦尔网站上的《批准清洁剂列表》。
XENON ™UL TRA 1962G无线蓝牙手持扫描器Xenon Ultra扫描器沿袭了霍尼韦尔条码技术的诸多优势,为零售商提供了增强的扫描性能和高级功能。
Xenon Ultra 1962g 扫描器采用霍尼韦尔新一代扫描技术,帮助零售商把保持效率和顾客服务放在首位。
如何围绕POS收银结算、输送机和客户自由移动依然是当今零售从业人员亟待克服的一大挑战。
随着更多的技术被集成到简约的现代化收银台,自由空间变得更加宝贵。
借助Xenon Ultra无线扫描器,您的从业人员就能够更专注于提升客户体验,避免因整理线缆而浪费时间并获得更大的空间来完成交易。
一台扫描器支持多种电源选项。
可选不带电池的超级电容器和标准锂离子电池,两种电源选项均支持无线充电。
无电池技术采用超级电容器替代了传统电池,能通过USB接口在不到四分钟的时间内充满电(使用供电的USB接口或外部电源适配器时仅需不到60秒)。
Xenon Ultra 1962g-BF扫描器每次充满电后可扫描至少450次,非常适用于自助结账或用作双窗扫描器中的辅助扫描器。
特点&优势除了绿点瞄准器可明显增强瞄准能力并提高扫描精度外,新设计的创新扫描平台也让扫描操作更迅速。
Xenon Ultra 1962的带电池和无电池型号都具有先进的无线充电选项,能有效减少因腐蚀而导致设备故障的次数。
超级电容器充满电后的续航时间可长达数小时,即使操作人员在休息前忘记将扫描器放在充电器上也不会影响运营。
Xenon Ultra 1962扫描器具有锂离子电池供电或使用超级电容器驱动的无电池型号,使企业能拥有混合设备池,并在实际应用中实现更好的灵活性。
C#USB扫码枪winForm处理方法
C#USB扫码枪winForm处理⽅法⽹上⼤神的⽅法是⽆焦点接收USB扫码枪数据,我的需求是当前窗⼝接收就⾏,没有必要设置全局键盘钩⼦。
⾃⼰琢磨了⼀个类,没有API调⽤:///<summary>///条码解析类///</summary>public class Cl_BarCodeReader{#region属性///<summary>///发布器委托///</summary>///<param name="Barcode">有效码值字符串</param>///<param name="cl">条码种类</param>public delegate void ScanerDelegate(string Barcode, Barcode_Class cl);///<summary>///接收到有效条码的事件发布器///</summary>public event ScanerDelegate ScanerReceived;///<summary>///条码信息字符串///</summary>public string BarCode { get; set; }///<summary>///按键数组///</summary>public List<Keys> MyKeys { get; set; }///<summary>///初始按键时间///</summary>public long MyTime { get; set; }#endregion#region构造///<summary>///空⽩构造函数///</summary>public Cl_BarCodeReader(){BarCode = "";MyKeys = new List<Keys>();MyTime = 0;}#endregion#region编辑///<summary>///处理⼀个捕获的按键键值,如果扫码完毕,触发接收事件ScanerReceived///传递包含的码值字符串和条码种类枚举///编码规则:nn...ED,n是数字,末尾两个字母ED///前两位数字表⽰预先规定的条码的种类/来源,例如:/// 01 - 执⾏跟踪号/// 02 - 计划跟踪号/// ...///</summary>///<param name="key">按键键值</param>public void Add(Keys key){//忽略扫码枪传来的Shift键值if (key == Keys.ShiftKey) return;var tick = DateTime.Now.Ticks;//初次接收if (MyKeys.Count == 0){//如果不是数字,不处理if (!char.IsDigit(Convert.ToChar(key))) return;MyKeys.Add(key);MyTime = tick;return;}//计算和第⼀个键值的时间差var tsp = tick - MyTime;/*//在即时窗⼝输出时间差、键值,调试⽤var tk = new Task(() => Debug.WriteLine(tsp.ToString() + " " + Convert.ToChar(key) + " " + key.ToString()));tk.Start();*///时间差⼤于50毫秒时,不是扫码枪按键,重新捕获if (tsp > 10000 * 50){MyKeys.Clear();MyTime = 0;Add(key);}else{//检查第⼆位是否为数字,此处需根据条码的编码规则修改if (MyKeys.Count == 1){if (!char.IsDigit(Convert.ToChar(key))){MyKeys.Clear();MyTime = 0;return;}}MyKeys.Add(key);//当存储的键值超过4个时,检查是否结束if (MyKeys.Count > 4){//末两位是EDif (MyKeys[MyKeys.Count - 2] == Keys.E && MyKeys[MyKeys.Count - 1] == Keys.D) {BarCode = "";for (int i = 0; i < MyKeys.Count; i++){BarCode += Convert.ToChar(MyKeys[i]);}MyKeys.Clear();MyTime = 0;var cd = Code();//触发事件if (!string.IsNullOrEmpty(cd))ScanerReceived(cd, BarCodeClass());}}}}#endregion#region判断///<summary>///判断当前的条码字符串是否有效///</summary>///<returns></returns>public bool IsEffect(){return IsEffect(BarCode);}///<summary>///判断指定的条码字符串是否是有效条码///</summary>///<param name="barcode"></param>///<returns></returns>public static bool IsEffect(string barcode){//长度检查if (barcode.Length < 5) return false;//前两位数字检查if (!char.IsDigit(barcode, 0) || !char.IsDigit(barcode, 1)) return false;//末两位是否是EDif (barcode.Substring(barcode.Length - 2, 2) != "ED") return false;//条码种类检查if (BarCodeClass(barcode.Substring(0, 2)) == Barcode_Class.Unkown) return false;return true;}#endregion#region信息///<summary>///返回当前条码字符串中的信息部分///⽆效返回空字符串///</summary>///<returns></returns>public string Code(){return Code(BarCode);}///<summary>///返回条码字符串中的信息部分///</summary>///<param name="barcode"></param>///<returns></returns>public static string Code(string barcode){if (IsEffect(barcode)){//去除前两位和末两位return barcode.Substring(2, barcode.Length - 4);}elsereturn"";}///<summary>///返回当前条码种类枚举///</summary>///<returns></returns>public Barcode_Class BarCodeClass(){if (BarCode.Length > 4)return BarCodeClass(BarCode.Substring(0, 2));elsereturn Barcode_Class.Unkown;}///<summary>///返回当前条码种类名称///</summary>///<returns></returns>public string BarCodeClassName(){var bclass = BarCodeClass();//GetEnumDescription是⼀个利⽤反射获取枚举⾃定义特性的⽅法,具体实现可以百度return Cl_General.GetEnumDescription(bclass);}///<summary>///依据条码前缀,返回条码种类枚举///</summary>///<param name="codepre"></param>public static Barcode_Class BarCodeClass(string codepre){switch (codepre){case"01":return Barcode_Class.CarryTrackCode;case"02":return Barcode_Class.PlanTrackCode;default:return Barcode_Class.Unkown;}}///<summary>///依据条码前缀,返回条码种类名称///</summary>///<param name="codepre"></param>///<returns></returns>public static string BarCodeClassName(string codepre){var bclass = BarCodeClass(codepre);//GetEnumDescription是⼀个利⽤反射获取枚举⾃定义特性的⽅法,具体实现可以百度return Cl_General.GetEnumDescription(bclass);}#endregion}///<summary>///条码种类枚举///</summary>public enum Barcode_Class{[Description("未知")]///<summary>///未知///</summary>Unkown,[Description("执⾏跟踪号")]///<summary>///执⾏跟踪号///</summary>CarryTrackCode,[Description("计划跟踪号")]///<summary>///计划跟踪号///</summary>PlanTrackCode}我把这个类放在了我的基窗⼝⾥,继承窗⼝只需要override ScanerHandler来实现具体的收到条码⽅法,窗体Load时调⽤⼀次SetBarCodeReader即可:public partial class fm_BaseForm : Form{protected Cl_BarCodeReader BReader = null;///<summary>///窗体键抬起事件处理过程,⽤于截获扫码枪消息///</summary>///<param name="sender"></param>///<param name="e"></param>protected virtual void Form_KeyUp(object sender, KeyEventArgs e) {BReader.Add(e.KeyCode);}///<summary>///启⽤扫码枪监视对象///</summary>protected virtual void SetBarCodeReader(bool setkeypre = true){if (setkeypre){this.KeyPreview = true;this.KeyUp += Form_KeyUp;}if (BReader == null){BReader = new Cl_BarCodeReader();BReader.ScanerReceived += ScanerHandler;}}///<summary>///停⽌扫码枪监视对象///</summary>protected virtual void StopBarCodeReader(bool setkeypre = true){if (setkeypre){this.KeyUp -= Form_KeyUp;this.KeyPreview = false;}if (BReader != null){BReader.ScanerReceived -= ScanerHandler;BReader = null;}}///<summary>///收到有效条码时的处理过程///</summary>///<param name="bcode"></param>protected virtual void ScanerHandler(string bcode, Barcode_Class cl) {//收到有效条码时的详细过程...}}。
C#程序下扫描枪扫描文本自动执行解决方案
C#程序下扫描枪扫描⽂本⾃动执⾏解决⽅案
扫码枪扫描特性
扫描枪扫描⽂本后都有结束符,可以⾃⾏配置,如加回车 or 回车+换⾏ or TAB。
通过结束符实现⾃动处理后续业务逻辑。
C# WinForm控件:
TextBox⽂本框
事件分析:
Leave事件:就是当窗体不是当前窗体时引发的事件。
⽂本⼀次扫描上,但不按下其他键,不执⾏。
⽆法实现⾃动执⾏。
NO PASS TextChange事件:在控件上更改Text属性值时引发的事件。
扫描枪向⽂本框输⼊值,每⼀个字符都执⾏⼀次。
NO PASS KeyPress事件:在控件具有焦点不能并且按下并释放某个按键后发⽣。
PASS
private void textbox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 13)//如果输⼊的是回车键
{
//业务逻辑
}
}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
条码扫描器接口编程(C#)3年前写了一篇《USB口的红外条形码扫描器的另类使用》,不过相关代码是VB编写,在这几年之间,有许多网友提出需要C#版的,起初还以为由VB修改C#应该很容易,最近研究了一下,发现C#和VB调用API的机制还是有所不同的,在迁移的过程中还是会遇到不少问题,所以我专门抽时间做了一个基于C#的程序。
【目前的条形码扫描器有点类似外接键盘(其实从消息传送上它就相当于一个键盘),把输入焦点定位到可输入的控件上,一扫描相应的条形码信息就输入到文本框中去了,但是如果没有输入焦点,或另一个不相干的程序获得输入焦点,那就有点乱套了。
我想实现的是,不管什么情况,只要扫描器一工作,我的程序就能自动激活,并能获得当前输入的条形码信息。
实现思路:我用的是litele牌的USB口的红外条形码扫描器,仔细分析了一下,扫描成功后,以键盘按键消息的形式把条形码输入信息通知给系统。
这样通过键盘钩子就可以方便的获得该信息了。
但是,怎样区分信息是键盘还是条形码输入的哪?很简单,条形码扫描器在很短的时间内输入了至少3个字符以上信息,并且以“回车”作为结束字符,在这种思想指引下,很完美的实现了预定功能。
】窗体相关代码:view plaincopy to clipboardprint? .........10........20........30........40........50........60........70........80........90........100.......110.......120.......130.......140. (150)using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace ReadBadCode{public partial class frmTest : Form{BarCodeHook BarCode = new BarCodeHook();public frmTest(){InitializeComponent();BarCode.BarCodeEvent += new BarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);}private delegate void ShowInfoDelegate(BarCodeHook.BarCodes barCode);private void ShowInfo(BarCodeHook.BarCodes barCode){if (this.InvokeRequired){this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object[] { barCode });}else{textBox1.Text = barCode.KeyName;textBox2.Text = barCode.VirtKey.ToString();textBox3.Text = barCode.ScanCode.ToString();textBox4.Text = barCode.AscII.ToString();textBox5.Text = barCode.Chr.ToString();textBox6.Text = barCode.IsValid ? barCode.BarCode : "";}}void BarCode_BarCodeEvent(BarCodeHook.BarCodes barCode){ShowInfo(barCode);}private void frmTest_Load(object sender, EventArgs e){BarCode.Start();}private void frmTest_FormClosed(object sender, FormClosedEventArgs e){BarCode.Stop();}private void textBox6_TextChanged(object sender, EventArgs e){if (textBox6.Text.Length > 0){MessageBox.Show(textBox6.Text);}}}}BarCodeHook 类:view plaincopy to clipboardprint? .........10........20........30........40........50........60........70........80........90........100.......110.......120.......130.......140. (150)using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Reflection;namespace ReadBadCode{public class BarCodeHook{public delegate void BarCodeDelegate(BarCodes barCode);public event BarCodeDelegate BarCodeEvent;public struct BarCodes{public int VirtKey; //虚拟码public int ScanCode; //扫描码public string KeyName; //键名public uint AscII; //AscIIpublic char Chr; //字符public string BarCode; //条码信息public bool IsValid; //条码是否有效public DateTime Time; //扫描时间}private struct EventMsg{public int message;public int paramL;public int paramH;public int Time;public int hwnd;}[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]private static extern bool UnhookWindowsHookEx(int idHook);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);[DllImport("user32", EntryPoint = "GetKeyNameText")]private static extern int GetKeyNameText(int lParam, StringBuilder lpBuffer, int nSize);[DllImport("user32", EntryPoint = "GetKeyboardState")]private static extern int GetKeyboardState(byte[] pbKeyState);[DllImport("user32", EntryPoint = "ToAscii")]private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeyState, ref uint lpChar, int uFlags);delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);BarCodes barCode = new BarCodes();int hKeyboardHook = 0;string strBarCode = "";private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){if (nCode == 0){EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));if (wParam == 0x100) //WM_KEYDOWN = 0x100{barCode.VirtKey = msg.message & 0xff; //虚拟码barCode.ScanCode = msg.paramL & 0xff; //扫描码StringBuilder strKeyName = new StringBuilder(255);if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255) > 0){barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0' });}else{barCode.KeyName = "";}byte[] kbArray = new byte[256];uint uKey = 0;GetKeyboardState(kbArray);if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0)){barCode.AscII = uKey;barCode.Chr = Convert.ToChar(uKey);}if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds > 50){strBarCode = barCode.Chr.ToString();}else{if ((msg.message & 0xff) == 13 && strBarCode.Length > 3) //回车{barCode.BarCode = strBarCode;barCode.IsValid = true;}strBarCode += barCode.Chr.ToString();}barCode.Time = DateTime.Now;if (BarCodeEvent != null) BarCodeEvent(barCode); //触发事件barCode.IsValid = false;}}return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);}// 安装钩子public bool Start(){if (hKeyboardHook == 0){//WH_KEYBOARD_LL = 13hKeyboardHook = SetWindowsHookEx(13, new HookProc(KeyboardHookProc), Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);}return (hKeyboardHook != 0);}// 卸载钩子public bool Stop(){if (hKeyboardHook != 0){return UnhookWindowsHookEx(hKeyboardHook);}return true;}}}【注意】要想测试实际的效果,必须执行编译后的Exe文件,在开发环境直接运行会没有效果的。