using System.Collections.Generic; using System.IO.Ports; using System.Linq; using System.Runtime.InteropServices; using Ursa.Controls; using 常用工具集.Base; namespace 常用工具集.ViewModel._04破解及系统相关 { public class 串口转键盘输入ViewModel : ViewModelBase { private SerialHelper helper; public bool Enabled { get; set; } = true; public string ButtonText { get; set; } = "打开"; public DelegateCommand ButtonCmd { get; set; } //串口号下拉列表数据 public List SerialList { get; set; } public int SerialIndex { get; set; } = 0; /// /// 波特率 /// public List BaudRateList { get; set; } public int BaudRateIndex { get; set; } = 0; //校验 public List ParityList { get; set; } public int ParityIndex { get; set; } = 0; //数据为 public List DataBitList { get; set; } public int DataBitIndex { get; set; } = 0; //停止位 public List StopBitList { get; set; } public int StopBitIndex { get; set; } = 0; public int Timeout { get; set; } = 1000; public 串口转键盘输入ViewModel() { //串口号 string[] portNames = SerialPort.GetPortNames(); if (portNames != null && portNames.Length > 0) { SerialList = portNames.ToList(); } //波特率 BaudRateList = new List() { 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600, 115200, 128000 }; BaudRateIndex = 6; //校验 ParityList = new List { "None", "Odd", "Even", "Mark", "Space" }; ParityIndex = 0; //数据位 DataBitList = new List { 5, 6, 7, 8 }; DataBitIndex = 3; //停止位 StopBitList = new List { "None", "One", "Two", "OnePointFive" }; StopBitIndex = 1; ButtonCmd = new DelegateCommand(ButtonCmdFunc); } private void ButtonCmdFunc(object obj) { if (ButtonText == "打开") { try { helper = new SerialHelper( SerialList[SerialIndex], BaudRateList[BaudRateIndex], DataBitList[DataBitIndex], (StopBits)StopBitIndex, (Parity)ParityIndex, Timeout ); helper.Open(); } catch { MessageBox.ShowAsync("串口打开失败"); return; } Enabled = false; ButtonText = "关闭"; GlobalValues.MainWindow.WindowState = Avalonia.Controls.WindowState.Minimized; } else { helper.Close(); helper = null; Enabled = true; ButtonText = "打开"; } } public class SerialHelper { [DllImport("user32")] static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); const uint KEYEVENTF_EXTENDEDKEY = 0x1; const uint KEYEVENTF_KEYUP = 0x2; private SerialPort serialPort; public SerialHelper(string portName, int baudRate, int dataBits, StopBits stopBits, Parity parity, int timeout) { serialPort = new SerialPort(); serialPort.PortName = portName; serialPort.BaudRate = baudRate; serialPort.DataBits = dataBits; serialPort.StopBits = stopBits; serialPort.Parity = parity; serialPort.ReadTimeout = timeout; serialPort.DataReceived += SerialPort1_DataReceived; } /// /// 打开串口 /// public void Open() { if (serialPort.IsOpen) return; serialPort.Open(); } /// /// 关闭串口 /// public void Close() { if (!serialPort.IsOpen) return; serialPort.Close(); } private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = serialPort.BytesToRead; byte[] buf = new byte[n]; serialPort.Read(buf, 0, n); foreach (byte b in buf) { if (b >= '0' && b <= '9') { keybd_event(b, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(b, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } else if (b >= 'a' && b <= 'z') { keybd_event((byte)(b - 32), 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event((byte)(b - 32), 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } else if (b >= 'A' && b <= 'Z') { keybd_event(16, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0);//按下Shift键 keybd_event(b, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(b, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); keybd_event(16, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);//松开Shift键 } else if (b == 0x0D || b == 0x0A) { keybd_event(0x0D, 0x45, KEYEVENTF_EXTENDEDKEY | 0, 0); keybd_event(0x0D, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0); } } } } } }