如何获取屏幕光标位置?
网上找了很多都不是我想要的,,
不是要鼠标的位置,,不是要当前窗体中光标的位置,,
而是要整个屏幕中激活的光标所处的位置,
想模拟一个XP自带的放大器程序里面那个功能,
在输入内容时跟踪的是光标而不是鼠标的位置,,

解决方案 »

  1.   

    太简单了
    第一种 API        [DllImport("User32.dll")]
            public static extern int GetCursorPos(out Point point);        public static Point ShowPoint()
            {
                Point showPoint = new Point();
                GetCursorPos(out showPoint);
                return showPoint;
            }第二种System.Windows.Forms.Cursor.Position这是最直接的
      

  2.   


    楼主有没有想哭的感觉?虽然你说得非常明白了,是插入点的位置,而非鼠标指针的位置,可是还是有人在......要实现你的要求,需要使用GetCaretPos这个函数,不过这个函数只对当前程序有效,如果是别的程序,需要附加输入队列
    所以还需要使用GetForegroundWindow和AttachThreadInput
      

  3.   

    谢谢,终于解决了……              #region 得到光标在屏幕上的位置
            [DllImport("user32")]
            public static extern bool GetCaretPos(out Point lpPoint);
            [DllImport("user32.dll")]
            private static extern IntPtr GetForegroundWindow();
            [DllImport("user32.dll")]
            private static extern IntPtr GetFocus();
            [DllImport("user32.dll")]
            private static extern IntPtr AttachThreadInput(IntPtr idAttach, IntPtr idAttachTo, int fAttach);
            [DllImport("user32.dll")]
            private static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
            [DllImport("kernel32.dll")]
            private static extern IntPtr GetCurrentThreadId();
            [DllImport("user32.dll")]
            private static extern void ClientToScreen(IntPtr hWnd, ref Point p);        private Point CaretPos()
            {
                IntPtr ptr = GetForegroundWindow();
                Point p = new Point();            //得到Caret在屏幕上的位置   
                if (ptr.ToInt32() != 0)
                {
                    IntPtr targetThreadID = GetWindowThreadProcessId(ptr, IntPtr.Zero);
                    IntPtr localThreadID = GetCurrentThreadId();                if (localThreadID != targetThreadID)
                    {
                        AttachThreadInput(localThreadID, targetThreadID, 1);
                        ptr = GetFocus();
                        if (ptr.ToInt32() != 0)
                        {
                            GetCaretPos(out   p);
                            ClientToScreen(ptr, ref   p);
                        }
                        AttachThreadInput(localThreadID, targetThreadID, 0);
                    }
                }
                return p;
            }
            #endregion