鼠标光标在所选文本上闪烁 - 如何防止这种情况?

che*_*ate 5 .net c# richtextbox winforms

在 RichTextBox(C#、.NET 4.0、WinForms)中将鼠标移到选定文本上时,我遇到了奇怪的行为:当我移动鼠标光标时,它在 Cursors.Arrow 和 Cursors.IBeam 之间闪烁。

我找到了禁用闪烁的代码:

protected override void WndProc(ref System.Windows.Forms.Message m)  
{  
     if (m.Msg == WM_SETCURSOR) //WM_SETCURSOR is set to 0x20
          return;
}
Run Code Online (Sandbox Code Playgroud)

但随后鼠标光标被卡在 Cursors.Arrow 中,即使我手动将其设置为其他内容,例如:

void RTFBox_MouseMove(object sender, MouseEventArgs e)
{
    Cursor = Cursors.IBeam;
}
Run Code Online (Sandbox Code Playgroud)

(我还在 MouseMove 函数中设置了逻辑来设置Cursor其他类型的非Arrow光标,这取决于鼠标悬停在什么上面。)

我也试过:

public override Cursor Cursor
{
    get
    {
        //(I have other logic here to determine the desired cursor type I want; in all cases it was a non-Arrow cursor)
        return Cursors.Cross; //'Cross' instead of 'IBeam' just to prove whether this works
    }
    set
    {
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

这成功地使光标成为一个十字(但仅当我注释掉WndProc代码时),但是当我将鼠标悬停在所选文本上时闪烁仍然存在(鼠标光标在箭头和十字之间变化)。

在试图找到解决方案时,我遇到了这篇文章,但是
SendMessage(Handle, LVM_SETHOTCURSOR, IntPtr.Zero, Cursors.IBeam.Handle);
从继承自 RichTextBox 的类调用并没有解决闪烁问题。

我的问题似乎与这篇文章中描述的问题相同,但该问题被描述为存在于 .NET 3.0 并在 .NET 3.5 中修复。

当我创建一个新项目并在表单中插入一个 RichTextBox 时,闪烁仍然存在。

因此,我的问题是:如何防止这种闪烁?或者有人知道这个问题是否在 .NET/visual studio 的更高版本中得到解决?

[更新:我下载了 Visual Studio 2013,但“闪烁”效果仍然存在。我下载了 .Net 4.5.1 安装程序并告诉它修复,但“闪烁”仍然存在。在“属性”>“参考”下,它说“System.Windows.Forms”是版本 4.0.0.0;我想这意味着更新 4.0 是不必要的?]

JDB*_*JDB 1

我真的无法谈论闪烁问题......这听起来像是您需要与供应商讨论的问题。

至于为什么你的代码“修复”了问题,但不允许你更改光标,它有助于更​​多地了解 Windows 消息泵的工作原理。

基本上,在较低级别,您正在拦截更改光标的请求,然后阻止它们。如果您查看此函数的文档,您将看到以下注释:

继承者注意事项
继承控件应调用基类的 WndProc 方法来处理它们不处理的任何消息。

您将重写此函数,本质上成为“继承者”,然后通过忽略它来“处理”请求光标更改的消息。