C#怎么获得当前屏幕光标的位置,然后在光标的位置上输入想输入数据

时间:2021-01-29 10:57:01
C#怎么获得当前屏幕光标的位置,然后在光标的位置上输入想输入数据

11 个解决方案

#1


在你需要获取光标的控件上做设定,控件.focus();让其获得焦点

#2


要输入 你总在有个什么动作再输入吧
在 click事件的处理函数里,有个参数MouseEventArgs e    e.X,e.y就是坐标,new一个textbox,然后textbox.location 设置成鼠标的坐标就可以了 输入完后销毁它

#3


如我在一个notepad中,我要取到notepad中光标的位置,然后再光标处插入数据,这样的。

#4


你要获得别的程序窗口的鼠标位置? 那要用到WINDOWS API接口,这个C#不熟悉,VC到时用过,做一个全局钩子就可以了

#5


textbox1.Cursor.HotSpot

#6


只是你的程序还是任何程序都可以?
自己程序就可以获得activeform然后找到焦点所在的控件,判断是否是textbox/richtextbox,如果不是则忽略,反之把新的字符串附加到text属性后面。

如果是其他的程序窗体,首先用GetForegroundWindow获得激活的窗体,然后获得焦点的控件,使用SendMessage发送WM_GETTEXT获取当前文本,使用WM_SETTEXT设置文本。

#7


用在在其他程序窗体上,有没有现成的例子呢,给个谢谢

#8


用GetForegroundWindow找到焦点窗体,然后GetWindowThreadProcessId和GetGUIThreadInfo找到含有光标的控件句柄,即GUITHREADINFO中的hwndCaret,然后用该句柄发送消息。


        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr 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;
        }

        public static GUITHREADINFO? GetGuiThreadInfo(IntPtr hwnd)
        {
            if (hwnd != IntPtr.Zero)
            {
                //Mbox.Info(GetTitle(hwnd), "O");
                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;
        }

        public static void SendText(string text)
        {
            IntPtr hwnd = GetForegroundWindow();
            if (String.IsNullOrEmpty(text))
                return;
            Hwindow.GUITHREADINFO? guiInfo = Hwindow.GetGuiThreadInfo(hwnd);
            if (guiInfo != null)
            {
                IntPtr ptr = (IntPtr)guiInfo.Value.hwndCaret;
                if (ptr != IntPtr.Zero)
                {
                    for (int i = 0; i < text.Length; i++)
                    {
                        SendMessage(ptr, Message.WM_CHAR, (IntPtr)(int)text[i], IntPtr.Zero);
                    }
                }
            }
        }

#9


 public void guangbiao(int index)//处理光标跟随以及光标下移的问题
        {
            ++index;
            this.textBox1.Focus();//给richTextBox焦点
            this.textBox1.Select(index, 0);
            this.textBox1.ScrollToCaret(); //滚动到控件光标处 

        }
我写的,从选定光标之后开始输入,

#10


SendKeys.SendWait(想输入的字符 + "{ENTER}");  //换行输出
SendKeys.SendWait(想输入的字符+"{TAB}");   //间隔输出

#11


sendinput,光标在哪哪输入

#1


在你需要获取光标的控件上做设定,控件.focus();让其获得焦点

#2


要输入 你总在有个什么动作再输入吧
在 click事件的处理函数里,有个参数MouseEventArgs e    e.X,e.y就是坐标,new一个textbox,然后textbox.location 设置成鼠标的坐标就可以了 输入完后销毁它

#3


如我在一个notepad中,我要取到notepad中光标的位置,然后再光标处插入数据,这样的。

#4


你要获得别的程序窗口的鼠标位置? 那要用到WINDOWS API接口,这个C#不熟悉,VC到时用过,做一个全局钩子就可以了

#5


textbox1.Cursor.HotSpot

#6


只是你的程序还是任何程序都可以?
自己程序就可以获得activeform然后找到焦点所在的控件,判断是否是textbox/richtextbox,如果不是则忽略,反之把新的字符串附加到text属性后面。

如果是其他的程序窗体,首先用GetForegroundWindow获得激活的窗体,然后获得焦点的控件,使用SendMessage发送WM_GETTEXT获取当前文本,使用WM_SETTEXT设置文本。

#7


用在在其他程序窗体上,有没有现成的例子呢,给个谢谢

#8


用GetForegroundWindow找到焦点窗体,然后GetWindowThreadProcessId和GetGUIThreadInfo找到含有光标的控件句柄,即GUITHREADINFO中的hwndCaret,然后用该句柄发送消息。


        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr 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;
        }

        public static GUITHREADINFO? GetGuiThreadInfo(IntPtr hwnd)
        {
            if (hwnd != IntPtr.Zero)
            {
                //Mbox.Info(GetTitle(hwnd), "O");
                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;
        }

        public static void SendText(string text)
        {
            IntPtr hwnd = GetForegroundWindow();
            if (String.IsNullOrEmpty(text))
                return;
            Hwindow.GUITHREADINFO? guiInfo = Hwindow.GetGuiThreadInfo(hwnd);
            if (guiInfo != null)
            {
                IntPtr ptr = (IntPtr)guiInfo.Value.hwndCaret;
                if (ptr != IntPtr.Zero)
                {
                    for (int i = 0; i < text.Length; i++)
                    {
                        SendMessage(ptr, Message.WM_CHAR, (IntPtr)(int)text[i], IntPtr.Zero);
                    }
                }
            }
        }

#9


 public void guangbiao(int index)//处理光标跟随以及光标下移的问题
        {
            ++index;
            this.textBox1.Focus();//给richTextBox焦点
            this.textBox1.Select(index, 0);
            this.textBox1.ScrollToCaret(); //滚动到控件光标处 

        }
我写的,从选定光标之后开始输入,

#10


SendKeys.SendWait(想输入的字符 + "{ENTER}");  //换行输出
SendKeys.SendWait(想输入的字符+"{TAB}");   //间隔输出

#11


sendinput,光标在哪哪输入