C# WinForms 修改Cursor.Current鼠标指针后无法保持生效问题排查
问题根因
你直接修改System.Windows.Forms.Cursor.Current属于临时修改,该值无法持久保留的原因如下:
- WinForms 中每个控件都有独立的
Cursor属性,当鼠标悬浮在任意控件上方时,系统会自动将全局Cursor.Current替换为当前悬浮控件的Cursor属性值。你点击按钮后鼠标仍停在按钮控件上,按钮的默认Cursor为Cursors.Default,因此点击事件执行完成后,系统自动把光标切回了默认值。 Cursor.Current的修改默认仅在当前窗口消息的处理周期内有效,一旦当前事件(此处为按钮点击事件)处理完成,下一次UI消息触发时如果没有重新赋值,就会被控件自带的光标配置覆盖。
解决方案
如果要让光标修改在当前窗体内持久生效,直接修改窗体的Cursor属性即可,无需操作全局的Cursor.Current:
private bool ChangeMouse = true; private void button1_Click(object sender, EventArgs e) { Console.WriteLine("CURSOR-TOP: " + Cursor.Current.ToString()); if (ChangeMouse) { ChangeMouse = false; this.Cursor = Cursors.Cross; } else { ChangeMouse = true; this.Cursor = Cursors.Default; } Console.WriteLine("CURSOR-BOTTOM: " + Cursor.Current.ToString()); Console.WriteLine(""); }
如果需要让光标在整个应用的所有窗口都生效,可以给所有已打开的窗体统一设置Cursor属性,或者重写窗体的WndProc方法拦截WM_SETCURSOR消息,强制返回目标光标类型。
内容的提问来源于stack exchange,提问作者RickInWestPalmBeach
相关产品推荐
相关产品推荐

