【问题标题】:How to prevent cursor from "jumping" into textbox when you type键入时如何防止光标“跳入”文本框
【发布时间】:2010-08-17 20:01:52
【问题描述】:

如果您将焦点放在文本框上,但鼠标光标未完全悬停在其上,则鼠标光标具有默认箭头形状或您定义的任何形状。

当您开始输入时,鼠标光标会自行隐藏,您只能在文本框中看到闪烁的 IBeam 类型光标。

问题:即使开始打字,如何将鼠标光标保持在初始位置?

有趣的是:这不会发生在 WPF 应用程序中。

【问题讨论】:

  • 我不得不问,为什么?通常,像这样试图破坏核心 UI 模式的人最终会制作出非常不可用和烦人的应用程序。也许有更好的方法来实现你的最终目标(这里没有表达)?
  • 嗯.. 我需要从磁卡读卡器获取数据。所以它实际上在刷卡时会返回带有一些可区分模式的很长的字符串,并且它的工作速度相对较慢,与使用键盘快速键入文本的用户一样慢。它需要超过 4 秒。从阅读器读取所有数据。我决定当输入获得第一个字符时,如果它看起来像读者的字符串,我将焦点移到另一个文本框,该文本框在技术上是可见的,但移到了表单的边界之外。在它获得其余输入之前,我必须显示繁忙的光标。

标签: c# winforms mouse-cursor


【解决方案1】:

伙计们……这太容易了。在 TextBox.KeyDown 中,我每次都必须移动光标以指向它之前的位置..

 Cursor.Position = new Point( oldX, oldY ); 

这里唯一丑陋的东西 - 如果它是一个动画光标,动画每次都会重新开始。而且您不能同时键入和移动鼠标。那 '有点糟糕,另一方面,谁在乎? Winform 应用程序往往比 WPF 应用程序更丑,不是吗?

【讨论】:

  • 因此最终调用了 SetCursor()。你有它。
【解决方案2】:

我要回答这个问题。副作用和后果是您的责任。还有另一种方法吗?我确定。

创建一个“状态”变量来保存用户是否正在输入的状态。文本框有各种事件让您知道有人在打字时、EN_CHANGE 等、整个事件系列等等。用户键入时将状态变量设置为 true。不输入时为 False,EN_LOSTFOCUS 等。

通过 PreProcessMessage 事件或 PreTranslateMessage 事件或任何看起来合适的事件捕获鼠标输入。

当状态变量为真时,在 OnPaint 事件中调用“ShowCursor”或可能的“SetCursor”。是的,毛茸茸的,嗯。状态变量为 false 时不要调用它。

在此之后调试、调试、调试。高温

如果这不是明确的帖子,我会扩展我的答案。

【讨论】:

  • 查看 Ike 的答案以获得更多“WinForm”风格的答案。
【解决方案3】:

这是 Windows 设置。

在控制面板下,转到鼠标,然后您应该会看到类似于“键入时隐藏指针”的设置

【讨论】:

  • 即使关闭该选项,如果指针位于文本框上,当用户开始输入时它也会消失。
  • 我刚刚检查过,它对我来说并没有消失。它只是变为闪烁的“I”而不是指针。
  • 如果我没看错的话,这正是 OP 的问题。
  • 是的.. 即使启用此设置,它也会隐藏鼠标点。此外,我需要一个程序化的解决方案。
  • @Anna 是对的。问题是,我想让鼠标指针保持可见。
【解决方案4】:

据我所知,没有办法做到这一点。即使关闭了 Windows 的“键入时隐藏指针”设置,如果光标不仅位于文本框上,而且位于整个表单上,光标也会消失。

文本框控件或表单的属性中似乎没有任何影响此行为的内容。

【讨论】:

  • 嗯...也许很难做到这一点?获取鼠标指针位置并在 TextBox.KeyDown 事件中每次都将其放置在之前?类似的东西?
  • 放置“Cursor.Show();”进入 KeyDown 事件会使光标在您完成输入时有时会重新出现。
  • 不...我需要在打字时显示光标...我试过你说的 - 没用...
  • 哦..有一个解决方法我可以在该位置绘制()光标。但关键是我需要使用动画繁忙光标。但是 Draw() 只会画一个……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2020-02-25
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多