菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
215
0

光标跟随

原创
05/13 14:22
阅读数 14015
       #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

发表评论

0/200
215 点赞
0 评论
收藏