软件编程
位置:首页>> 软件编程>> C#编程>> C#实现扫描枪扫描二维码并打印(实例代码)

C#实现扫描枪扫描二维码并打印(实例代码)

作者:weixin_33691598  发布时间:2023-02-26 18:02:56 

标签:C#,扫描枪,扫描,二维码

1.使用usb口输入的扫描枪,这里实现使用了winform

首先创建一个CS文件


using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
namespace am_sign
{
class BardCodeHooK
{
 public delegate void BardCodeDeletegate(BarCodes barCode);
 public event BardCodeDeletegate BarCodeEvent;
 public struct BarCodes
 {
  public int VirtKey;//虚拟吗
  public int ScanCode;//扫描码
  public string KeyName;//键名
  public uint Ascll;//Ascll
  public 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 IParam, 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[] lpKeySate, 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(225);
    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.Ascll = uKey;
     barCode.Chr = Convert.ToChar(uKey);
    }
    TimeSpan ts = DateTime.Now.Subtract(barCode.Time);
    if (ts.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=13
   hKeyboardHook = 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;
 }
}
}

2.在winform中调用


BardCodeHooK BarCode = new BardCodeHooK();
 public Form1()
 {
  InitializeComponent();
  BarCode.BarCodeEvent += new BardCodeHooK.BardCodeDeletegate(BarCode_BarCodeEvent);
 }
 string value = ""; //value为扫码枪获取的内容,以Enter结尾
 private delegate void ShowInfoDelegate(BardCodeHooK.BarCodes barCode);
 private void ShowInfo(BardCodeHooK.BarCodes barCode)
 {
  if (this.InvokeRequired)
  {
   this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object[] { barCode });
  }
  else
  {
   if (barCode.KeyName.Equals("Enter"))
   {
    hook_KeyDown(value);
    value = "";
   }
   else
   {
    value += barCode.Chr.ToString();
   }
  }
 }
 void BarCode_BarCodeEvent(BardCodeHooK.BarCodes barCode)
 {
  ShowInfo(barCode);
 }

3.打印前,需要将TSLIB.dll文件放入c:\\windows\system下


using System.Runtime.InteropServices;
namespace am_sign
{
class TSCLIB_DLL
{
 [DllImport("TSCLIB.dll", EntryPoint = "about")]
 public static extern int about();
 [DllImport("TSCLIB.dll", EntryPoint = "openport")]
 public static extern int openport(string printername);
 [DllImport("TSCLIB.dll", EntryPoint = "barcode")]
 public static extern int barcode(string x, string y, string type,
     string height, string readable, string rotation,
     string narrow, string wide, string code);
 [DllImport("TSCLIB.dll", EntryPoint = "clearbuffer")]
 public static extern int clearbuffer();
 [DllImport("TSCLIB.dll", EntryPoint = "closeport")]
 public static extern int closeport();
 [DllImport("TSCLIB.dll", EntryPoint = "downloadpcx")]
 public static extern int downloadpcx(string filename, string image_name);
 [DllImport("TSCLIB.dll", EntryPoint = "formfeed")]
 public static extern int formfeed();
 [DllImport("TSCLIB.dll", EntryPoint = "nobackfeed")]
 public static extern int nobackfeed();
 [DllImport("TSCLIB.dll", EntryPoint = "printerfont")]
 public static extern int printerfont(string x, string y, string fonttype,
      string rotation, string xmul, string ymul,
      string text);
 [DllImport("TSCLIB.dll", EntryPoint = "printlabel")]
 public static extern int printlabel(string set, string copy);
 [DllImport("TSCLIB.dll", EntryPoint = "sendcommand")]
 public static extern int sendcommand(string printercommand);
 [DllImport("TSCLIB.dll", EntryPoint = "setup")]
 public static extern int setup(string width, string height,
     string speed, string density,
     string sensor, string vertical,
     string offset);
 [DllImport("TSCLIB.dll", EntryPoint = "windowsfont")]
 public static extern int windowsfont(int x, int y, int fontheight,
  int rotation, int fontstyle, int fontunderline,
      string szFaceName, string content);
 //打开打印机端口,并进行相关设置
 public static void openportExt()
 {
  TSCLIB_DLL.openport("Gprinter GP-3120TU");//找打打印机端口
  TSCLIB_DLL.sendcommand("SIZE 70 mm,50 mm");//设置条码大小
  TSCLIB_DLL.sendcommand("GAP 2 mm,0");//设置条码间隙
  TSCLIB_DLL.sendcommand("SPEED 5");//设置打印速度
  TSCLIB_DLL.sendcommand("DENSITY 8");//设置墨汁浓度
  TSCLIB_DLL.sendcommand("DERECTION 1");//设置相对起点
  TSCLIB_DLL.sendcommand("REFERENCE 3 mm,3 mm");//设置偏移边框
  TSCLIB_DLL.sendcommand("CLS");//清除记忆(每次打印新的条码时先清除上一次的打印记忆)
 }
 //打印在二维码
 public static void printVehicleCode(string name, string department, string seat_area,string qrcode)
 {
  TSCLIB_DLL.sendcommand("CLS");//需要清除上一次的打印记忆
  TSCLIB_DLL.sendcommand("QRCODE 207,180,L,6,A,0,M2,S3,\"" + qrcode + "\"");
  TSCLIB_DLL.windowsfont(200, 30, 60, 0, 2, 0, "Microsoft YaHei", name);
  TSCLIB_DLL.windowsfont(210, 100, 30, 0, 0, 0, "Microsoft YaHei", department);
  TSCLIB_DLL.windowsfont(20, 320, 40, 0, 0, 0, "Microsoft YaHei", seat_area);
  TSCLIB_DLL.printlabel("1", "1");
 }
 //关闭打印机端口
 public static void closeportExt()
 {
  TSCLIB_DLL.closeport();
 }
}
}

4.调用打印


TSCLIB_DLL.openportExt();           //Open specified printer driver
TSCLIB_DLL.printVehicleCode(“测试”, “测试”, "测试", “二维码内容”);
TSCLIB_DLL.closeport();

总结

以上所述是小编给大家介绍的C#实现扫描枪扫描二维码并打印网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

来源:https://blog.csdn.net/weixin_33691598/article/details/91659687

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com