C#如何获取reachtextbox光标的屏幕坐标
我现在搞的这个东西就像C#编辑器一样的这种,在敲打一些代码的时候下面自动出现提示的这种东西,如果要做出这个,必须获取当前光标所在位置,以确定帮助列表框出现的位置。我想了好...
我现在搞的这个东西就像C#编辑器一样的这种,在敲打一些代码的时候下面自动出现提示的这种东西,如果要做出这个,必须获取当前光标所在位置,以确定帮助列表框出现的位置。我想了好长时间,都不知道这个该如何去实现,要求是自己写的代码越少越好,因为像这种调用系统的东西,自己写的代码越少,出意外的概率也就越少。所以我希望能调用系统api或者其它什么的去实现,如果用selectstart做计算实现的话,要保证当有了水平或铅垂滚动条的时候,所获取的点也要在光标所在位置上,而且有可能字体大小还不一样,所以这种方法我认为不怎么可取。
使用的语言只要是.net窗体模式的都行,C#,vb.net 都没关系,wpf窗体模式能实现也好 展开
使用的语言只要是.net窗体模式的都行,C#,vb.net 都没关系,wpf窗体模式能实现也好 展开
1个回答
展开全部
#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)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询