winform 不在同一程序内,如何在光标处(当前有焦点的窗体输入框)输入字符

  • 上位机程序通过串口获取读码器的数据,需要自动上传到同一台电脑上的第三方程序的输入光标处。
  • 参考代码:
  • 不在同一程序内,如何在光标处(当前有焦点的窗体输入框)输入字符 - 数据酷软件 - 博客园   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); //发送字符串
                }
            }     
        }

     

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值