C#如何获取reachtextbox光标的屏幕坐标

我现在搞的这个东西就像C#编辑器一样的这种,在敲打一些代码的时候下面自动出现提示的这种东西,如果要做出这个,必须获取当前光标所在位置,以确定帮助列表框出现的位置。我想了好... 我现在搞的这个东西就像C#编辑器一样的这种,在敲打一些代码的时候下面自动出现提示的这种东西,如果要做出这个,必须获取当前光标所在位置,以确定帮助列表框出现的位置。我想了好长时间,都不知道这个该如何去实现,要求是自己写的代码越少越好,因为像这种调用系统的东西,自己写的代码越少,出意外的概率也就越少。所以我希望能调用系统api或者其它什么的去实现,如果用selectstart做计算实现的话,要保证当有了水平或铅垂滚动条的时候,所获取的点也要在光标所在位置上,而且有可能字体大小还不一样,所以这种方法我认为不怎么可取。

使用的语言只要是.net窗体模式的都行,C#,vb.net 都没关系,wpf窗体模式能实现也好
展开
 我来答
cipherf
推荐于2016-04-01 · TA获得超过4.5万个赞
知道大有可为答主
回答量:2.3万
采纳率:67%
帮助的人:1.5亿
展开全部
       #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
追问
请问下下,为什么要做这个判断呢?
if (localThreadID != targetThreadID)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式