C# ~ ComPort2Keyboard 範例 [接收RS232 轉 (模擬)鍵盤輸出]
C# ~ ComPort2Keyboard 範例 [接收RS232 轉 (模擬)鍵盤輸出]
資料來源:
https://www.cnblogs.com/xinaixia/p/6216745.html
https://dotblogs.com.tw/jimmyyu/2009/09/21/10733
功能列表
01.讓視窗縮小到工具列吧-NotifyIcon
02.ComPort(RS232)監聽
03.模擬鍵盤輸出
code:
namespace ComPort2Keyboard { partial class Main { /// <summary> /// 設計工具所需的變數。 /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// 清除任何使用中的資源。 /// </summary> /// <param name="disposing">如果應該處置 Managed 資源則為 true,否則為 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form 設計工具產生的程式碼 /// <summary> /// 此為設計工具支援所需的方法 - 請勿使用程式碼編輯器修改 /// 這個方法的內容。 /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main)); this.button1 = new System.Windows.Forms.Button(); this.comboBox1 = new System.Windows.Forms.ComboBox(); this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(247, 7); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 0; this.button1.Text = "Connect"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // comboBox1 // this.comboBox1.FormattingEnabled = true; this.comboBox1.Location = new System.Drawing.Point(12, 9); this.comboBox1.Name = "comboBox1"; this.comboBox1.Size = new System.Drawing.Size(121, 20); this.comboBox1.TabIndex = 1; // // notifyIcon1 // this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon"))); this.notifyIcon1.Text = "ComPort2Keyboard"; this.notifyIcon1.Visible = true; this.notifyIcon1.DoubleClick += new System.EventHandler(this.notifyIcon1_DoubleClick); // // Main // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(349, 35); this.Controls.Add(this.comboBox1); this.Controls.Add(this.button1); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.MaximizeBox = false; this.Name = "Main"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "ComPort2Keyboard"; this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Main_FormClosing); this.Load += new System.EventHandler(this.Main_Load); this.SizeChanged += new System.EventHandler(this.Main_SizeChanged); this.ResumeLayout(false); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.ComboBox comboBox1; private System.Windows.Forms.NotifyIcon notifyIcon1; } }
using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace ComPort2Keyboard { public partial class Main : Form { [DllImport("user32")] public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo); public SerialPort m_port = new SerialPort(); public void SendKeybd(String StrData) { for (int i = 0; i < StrData.Length; i++) { String StrBuf = StrData.Substring(i, 1); byte[] byteArray = System.Text.Encoding.Default.GetBytes(StrBuf); for (int j = 0; j < byteArray.Length; j++) { if(byteArray[j] > 59) { keybd_event(0x10, 0, 0, 0);//VK_SHIFT keybd_event(byteArray[j], 0, 0, 0); //按下i keybd_event(byteArray[j], 0, 2, 0); //按下i后松开 keybd_event(0x10, 0, 2, 0);//VK_SHIFT } else { keybd_event(byteArray[j], 0, 0, 0); //按下i keybd_event(byteArray[j], 0, 2, 0); //按下i后松开 } } Thread.Sleep(20); } keybd_event(13, 0, 0, 0); //按下Enter keybd_event(13, 0, 2, 0); //按下Enter后松开 } public bool ByteArray2String(byte[] pdata, ref String StrData, bool blnReverse = true)//陣列轉字串 { StrData = ""; bool blnResult = true; if (blnReverse == true) { Array.Reverse(pdata); } try { for (int i = 0; i < pdata.Length; i++) { StrData += Convert.ToString(pdata[i], 16).PadLeft(2, '0'); } } catch { blnResult = false; } return blnResult; } public Main() { InitializeComponent(); } private void Main_Load(object sender, EventArgs e) { string[] serialPorts = SerialPort.GetPortNames(); ArrayList ALCpuSerialPorts = new ArrayList(); for (int i = 0; i < serialPorts.Length; i++) { ALCpuSerialPorts.Add(serialPorts[i]); } comboBox1.DataSource = ALCpuSerialPorts; } public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e) { //https://www.cnblogs.com/xinaixia/p/6216745.html try { //Comm.BytesToRead中为要读入的字节长度 int len = m_port.BytesToRead; Byte[] readBuffer = new Byte[len]; m_port.Read(readBuffer, 0, len); //将数据读入缓存 //处理readBuffer中的数据,自定义处理过程 String msg = ""; ByteArray2String(readBuffer, ref msg, true); msg = msg.Substring(8, 8).ToUpper(); SendKeybd(msg); } catch (Exception ex) { } } private void button1_Click(object sender, EventArgs e) { if(!m_port.IsOpen) { m_port.PortName = comboBox1.SelectedItem.ToString(); m_port.BaudRate = 115200;//jash.liao modified at 2020/02/12 m_port.DataBits = 8; m_port.StopBits = StopBits.One; m_port.Parity = Parity.None; m_port.ReadTimeout = 1; m_port.ReadTimeout = 3000; //单位毫秒 m_port.WriteTimeout = 3000; //单位毫秒 //串口控件成员变量,字面意思为接收字节阀值, //串口对象在收到这样长度的数据之后会触发事件处理函数 //一般都设为1 m_port.ReceivedBytesThreshold = 1; m_port.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听) m_port.Open(); button1.Text = "Disconnect"; this.WindowState = System.Windows.Forms.FormWindowState.Minimized; } else { button1.Text = "Connect"; m_port.Close(); } } private void Main_SizeChanged(object sender, EventArgs e) { //https://dotblogs.com.tw/jimmyyu/2009/09/21/10733 if (this.WindowState == FormWindowState.Minimized) { this.Hide(); this.notifyIcon1.Visible = true; } } private void notifyIcon1_DoubleClick(object sender, EventArgs e) { //https://dotblogs.com.tw/jimmyyu/2009/09/21/10733 this.Show(); this.WindowState = FormWindowState.Normal; } private void Main_FormClosing(object sender, FormClosingEventArgs e) { if (m_port.IsOpen) { m_port.Close(); } } } }
2 thoughts on “C# ~ ComPort2Keyboard 範例 [接收RS232 轉 (模擬)鍵盤輸出]”
C# Windows Forms 視窗 大小設定 控制
縮小到工具列
WindowState=System.Windows.Forms.FormWindowState.Minimized
璽瑞 GITHUB: https://github.com/jash-git/SYRIS_CS_Project_NSIS