- 上位机程序通过串口获取读码器的数据,需要自动上传到同一台电脑上的第三方程序的输入光标处。
- 参考代码:
- 不在同一程序内,如何在光标处(当前有焦点的窗体输入框)输入字符 - 数据酷软件 - 博客园 https://www.cnblogs.com/datacool/p/win_api_sendmessage_hwndFocus.html
- —————————————————————分割线———————————————————————
- 调试的时候发现上述博客的代码,并不能把textbox中以有的内容清空,光标会移动到textbox字符串的后面,这样textbox中的内容会越来越长,不满足需求。
- 补充资料:关于C# SendMessage用法 - Lellansin - 博客园 https://www.cnblogs.com/lellansin/archive/2012/05/14/2498739.html
- C# 窗体如何获取外部程序光标焦点-CSDN论坛 https://bbs.csdn.net/topics/390478795
- 修改后的,代码如下。
-
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { timer1.Start(); } private void button2_Click(object sender, EventArgs e) { timer1.Stop(); } private void timer1_Tick(object sender, EventArgs e) { SendText(DateTime.Now.ToString("HH:mm:ss:fff") + Environment.NewLine); } [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); /// <summary> /// 向指定窗口发送字符串,不会清空 /// </summary> [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam); // <summary> /// 向指定窗口发送字符串,每次刷新目标窗体的以有内容 /// </summary> [DllImport("User32.dll", EntryPoint = "SendMessage")] static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, string lParam); [DllImport("user32.dll")] static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); [DllImport("user32.dll")] static extern bool GetGUIThreadInfo(uint idThread, ref GUITHREADINFO lpgui); [StructLayout(LayoutKind.Sequential)] public struct GUITHREADINFO { public int cbSize; public int flags; public IntPtr hwndActive; public IntPtr hwndFocus; public IntPtr hwndCapture; public IntPtr hwndMenuOwner; public IntPtr hwndMoveSize; public IntPtr hwndCaret; public RECT rectCaret; } [StructLayout(LayoutKind.Sequential)] public struct RECT { int left; int top; int right; int bottom; } public GUITHREADINFO? GetGuiThreadInfo(IntPtr hwnd) { if (hwnd != IntPtr.Zero) { uint threadId = GetWindowThreadProcessId(hwnd, IntPtr.Zero); GUITHREADINFO guiThreadInfo = new GUITHREADINFO(); guiThreadInfo.cbSize = Marshal.SizeOf(guiThreadInfo); if (GetGUIThreadInfo(threadId, ref guiThreadInfo) == false) return null; return guiThreadInfo; } return null; } protected void SendText(string text) { IntPtr hwnd = GetForegroundWindow(); if (String.IsNullOrEmpty(text)) return; GUITHREADINFO? guiInfo = GetGuiThreadInfo(hwnd); if (guiInfo != null) { //for (int i = 0; i < text.Length; i++) //{ // SendMessage(guiInfo.Value.hwndFocus, 0x0102, (IntPtr)(int)text[i], IntPtr.Zero); //} SendMessage(guiInfo.Value.hwndFocus, 0x000C, IntPtr.Zero, text); //发送字符串 } } }