unity2018在PC状态下获取USB扫码枪数据

本文介绍了一种在Unity中实现扫码枪输入的方法,通过创建全局钩子监听键盘事件,解析并转换扫码枪输入的数据,使其能在游戏中正确显示。文章详细展示了如何使用C#代码设置和移除钩子,处理各种键盘输入,并提供了完整的脚本示例。

本来在PC状态下,扫码枪就是一个键盘。

1.简单的,直接创建InputField,就可直接显示在文本中,但是在项目里面不太现实,所以查阅资料找到了另一个方法。

2.建立全局钩子(其实我也不知道是啥),这代码也是参考了蛮多老哥的,自己修改了一下,代码如下。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System;
public class myHook : MonoBehaviour {

    public static myHook m_hInstance;

    //建立钩子
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
    //移除钩子
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool UnhookWindowsHookEx(IntPtr hhk);
    [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr GetModuleHandle(string lpModuleName);
    private const int WH_KEYBOARD_LL = 13;
    private const int WM_KEYDOWN = 0x0100;
    private static LowLevelKeyboardProc _proc = HookCallback;
    private static IntPtr _hookID = IntPtr.Zero;


    int lenNow = 0;
    int vkCodeLast = 0;
    private List<string> _result = new List<string>();  // 返回结果集 

    void Awake()
    {
        m_hInstance = this;
    }

    void Start()
    {
        _hookID = SetHook(_proc);
    }
    public static string getRet()
    {
        string s = string.Join("", myHook.m_hInstance._result.ToArray());

        //return s;
        if (s.EndsWith("\r\n"))
        {
            //myHook.m_hInstance._result.Clear();
            return s.Trim();
        }
        else
        {
            return "";
        }
    }

    public void ClearResult()
    {
        myHook.m_hInstance._result.Clear();
    }

    private static IntPtr SetHook(LowLevelKeyboardProc proc)
    {
        using (Process curProcess = Process.GetCurrentProcess())
        using (ProcessModule curModule = curProcess.MainModule)
        {
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
        }
    }
    private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

    private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
    {
        bool isShift = false;

        if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
        {
            
            int vkCode = Marshal.ReadInt32(lParam);
         //   UnityEngine.Debug.Log("ASCII:" + vkCode);

            if (vkCode >= 65 && vkCode <= 90)
                vkCode = vkCode + 32;//处理为小写字母

            if (myHook.m_hInstance.vkCodeLast == 160)
            {
                if (vkCode >= 48 && vkCode <= 57 )
                {
                    if(vkCode==48)
                        vkCode= 41;//)
                    else if (vkCode == 49)
                        vkCode = 33; //!
                    else if (vkCode == 50)
                        vkCode = 64;// @
                    else if (vkCode == 51)
                        vkCode = 35;//#
                    else if (vkCode == 52)
                        vkCode = 36;//$
                    else if (vkCode == 53)
                        vkCode = 37;//%
                    else if (vkCode == 54)
                        vkCode = 94;//^
                    else if (vkCode == 55)
                        vkCode = 38;//&
                    else if (vkCode == 56)
                        vkCode = 42;//*
                    else if (vkCode == 57)
                        vkCode = 40;//)
                    else if (vkCode == 189)
                        vkCode = 95;//_
                    else if (vkCode == 187)
                        vkCode = 43;//+
                }
                else if (vkCode >= 97 && vkCode <= 122)
                    vkCode = vkCode - 32;//为大写字母

                if (vkCode == 186)//:
                {
                    vkCode = 58;
                }else if (vkCode == 187)
                    vkCode = 43;//+
                else if (vkCode == 189)
                    vkCode = 95;//-
                else if (vkCode == 190)
                    vkCode = 62;//>
                else if (vkCode == 191)
                    vkCode = 63;//?
                else if (vkCode == 219)
                    vkCode = 123;//{
                else if (vkCode == 220)
                    vkCode = 124;//|
                else if (vkCode == 221)
                    vkCode = 125;//}
            }

            if (vkCode == 186)// ;
            {
                vkCode = 59;
            }
            if (vkCode == 187)// =
            {
                vkCode = 61;
            }
            if (vkCode == 189)// -
            {
                vkCode = 45;
            }
            if (vkCode == 190)//.
            {
                vkCode = 46;
            }
            if (vkCode == 191)// /
            {
                vkCode = 47;
            }
            if (vkCode == 219)
                vkCode = 91;//[
            if (vkCode == 220)
                vkCode = 92;//\
            if (vkCode == 220)
                vkCode = 93;//]

            if (vkCode == 109)// 数字键-
            {
                vkCode = 45;
            }

            if (vkCode == 13)
            {
                myHook.m_hInstance._result.Add("\r\n");
            }


            if (vkCode != 160 && vkCode!=13&&vkCode != 40)
            {
                myHook.m_hInstance.lenNow++;

                string alpha = Convert.ToChar(vkCode).ToString();
                myHook.m_hInstance._result.Add(alpha);
            }

            myHook.m_hInstance.vkCodeLast = vkCode;
        }
        return CallNextHookEx(_hookID, nCode, wParam, lParam);
    }
    
    void OnApplicationQuit()
    {
        UnhookWindowsHookEx(_hookID);
    }
}
3.在建立测试的脚本TextTest。

4.连接扫码枪就能获取了,串口模式的扫码枪我没试过,不知道用这个方法行不行

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值