得到光标在屏幕上的位置

 #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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ce键会删除光标前一个字符。 解题思路: 本题可以使用字符串模拟的方法来解决。首先定义一个空字符串,表示小明打字的文本内容。然后根据小明在键盘上按下的键,模拟光标的移动和文本的插入、删除等操作,最终得到最终显示的文本。 具体实现可以使用一个变量来表示光标位置,每次按下键盘上的键后,根据键的类型来更新光标位置和文本内容。例如,按下home键时,将光标位置设为0;按下end键时,将光标位置设为文本长度;按下←键时,将光标位置左移一位(如果光标在文本头则不移动);按下→键时,将光标位置右移一位(如果光标在文本尾则不移动);按下insert键时,切换插入和替换模式;按下backspace键时,删除光标前一个字符(如果光标在文本头则不删除)。 最终得到的文本即为小明屏幕上最终显示的文本。 代码实现: ### 回答2: 小明正在使用Microsoft Word打一篇文档,文档只包含小写字母a-z和空格。在打字过程中,他可能会按下home键、end键、左箭头键、右箭头键、insert键和backspace键,这些按键将影响他的文本输入和光标位置。现在,我们需要编写一个程序来模拟这个过程,给定小明在键盘上按键的序列,输出小明屏幕上最终显示的文本。 该程序可以通过模拟小明在键盘上按键的过程来实现。在按下任何键时,程序需要知道当前光标位置,并根据用户的输入来更新光标位置和文本。为了简化程序,我们可以使用列表来代表文档,其中每个元素代表一个字符。这样做可以方便地插入、删除和移动文本。 以下是该程序的基本思路: 1. 初始化一个空字符串,代表最终显示的文本。 2. 初始化一个整数变量pos,代表光标位置,初始值为0。 3. 初始化一个布尔变量insertMode,代表插入模式,初始值为True。 4. 遍历给定按键序列。 5. 对于每个按键: a. 如果按下的是字母或空格,将其插入到文本的当前位置,更新光标位置和显示的文本。 b. 如果按下的是home键,将光标位置设置为0。 c. 如果按下的是end键,将光标位置设置为文本长度。 d. 如果按下的是左箭头键,将光标位置左移一格(如果不在文本头),更新显示的文本。 e. 如果按下的是右箭头键,将光标位置右移一格(如果不在文本末尾),更新显示的文本。 f. 如果按下的是insert键,切换插入模式。 g. 如果按下的是backspace键,删除光标前面的一个字符,更新光标位置和显示的文本。 6. 输出最终显示的文本。 以下是该程序的Python代码实现: text = "" # 最终显示的文本 pos = 0 # 光标位置 insertMode = True # 插入模式 keys = input().strip() # 获取小明按键序列 for key in keys: if key in "abcdefghijklmnopqrstuvwxyz ": # 如果按下的是字母或空格 if insertMode or pos == len(text): # 如果是插入模式或者光标在文本末尾 text = text[:pos] + key + text[pos:] # 插入字符 else: # 否则是替换模式 text = text[:pos] + key + text[pos+1:] # 替换字符 pos += 1 # 更新光标位置 elif key == "home": # 如果按下的是home键 pos = 0 # 将光标移至文本开头 elif key == "end": # 如果按下的是end键 pos = len(text) # 将光标移至文本末尾 elif key == "left": # 如果按下的是左箭头键 if pos > 0: # 如果光标不在文本头 pos -= 1 # 将光标左移一格 elif key == "right": # 如果按下的是右箭头键 if pos < len(text): # 如果光标不在文本末尾 pos += 1 # 将光标右移一格 elif key == "insert": # 如果按下的是insert键 insertMode = not insertMode # 切换插入/替换模式 elif key == "backspace": # 如果按下的是backspace键 if pos > 0: # 如果光标不在文本头 text = text[:pos-1] + text[pos:] # 删除光标前面的字符 pos -= 1 # 将光标左移一格 print(text) # 输出最终文本 ### 回答3: 首先,我们可以开辟一个字符串数组来存放文档内容。 当小明按下字母键或空格键时,我们将其添加到数组中。 当小明按下删除键(backspace)时,我们将删除数组中的最后一个字符。 而按下home键时,我们可以将数组下标置0,即将光标放至文本的开始位置。 按下end键时,我们将数组下标置最大,即将光标放至文本的末尾位置。 按下左右方向键时,我们可以通过移动数组下标来改变光标位置(但要考虑到光标已经在文本开始或末尾的情况)。在这个过程中,我们将数组当前下标处的字符标记为光标位置。 至于insert键,我们可以设置一个状态变量来标志当前的插入状态。如果是插入状态,按下键盘上的字母键将在当前光标处插入新的字符,并将原数组中的字符依次向后移动一个位置。而如果是替换状态,则只需将当前光标位置的字符替换为按下的键盘上的字母键所对应的字符即可。 最后,我们遍历一遍数组并将其拼接成一个字符串输出即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值