应用程序如何禁用“键入时隐藏指针”选项?我遇到了一个隐藏光标的问题,即在不按Escape键或失去窗口焦点的情况下无法恢复光标。该应用程序已用C#编写,并使用WPF。不需要特定于技术的答案,因为使用任何技术都可能实现。

这是场景:用户可以在文本框中键入内容,并且自动完成列表会显示在该框的下方。但是,一旦用户开始键入,由于没有鼠标光标,他/她不再可以从下拉列表中选择一项。

我注意到Firefox没有这种行为。例如,在地址栏中输入URL时,鼠标光标永远不会消失。我在其他地方也看到过这种行为,所以我知道这是有可能的。

任何帮助是极大的赞赏!

最佳答案

通过设置断点,我发现您第一次在文本框中键入内容时,WPF会读取公共SystemParameters.MouseVanish属性,该属性调用SystemParametersInfo(SPI_GETMOUSEVANISH, ...)以获得鼠标消失的设置。随后对SystemParameters.MouseVanish的调用使用缓存的值。

两种可能的解决方案:


访问SystemParameters.MouseVanish,然后使用反射来覆盖缓存的结果,以便后续调用返回false。
调用Win32的SystemParametersInfo(SPI_SETMOUSEVANISH, ...)关闭消失(不通知),然后访问SystemParameters.MouseVanish,然后调用SystemParametersInfo(SPI_SETMOUSEVANISH, ...)将其设置回其先前值(不通知)


在用户开始在文本框中键入内容之前,可以随时执行上述任何一种操作。

这是反射解决方案的外观:

void LocallyDisableMouseVanish()
{
  if(SystemParameters.MouseVanish)
    foreach(var field in typeof(SystemParameters).GetFields(BindingFlags.NonPublic | BindingFlags.Static)
      if(field.Name.Contains("mouseVanish"))
        field.SetValue(null, false);
}


对于普通目的,一次执行就足够了,但是用户可能会在应用程序运行时更改设置,这将导致在下次访问时重新加载MouseVanish值。如果要防止这种情况,请使用HwndSource.AddHook挂钩WM_SETTINGCHANGE并安排回调以重新应用此修复程序:

const int WM_SETTINGCHANGE = 26;

public void AddSettingChangeHook()
{
  _settingChangeWatcher = new HwndSource(new HwndSourceParameters("WM_SETTINGSCHANGE watcher"));
  _settingChangeWatcher.AddHook((IntPtr hwnd, IntPtr msg, IntPtr wParam, IntPtr lParam, ref bool handled) =>
  {
    if((int)msg == WM_SETTINGCHANGE)
      Dispatcher.Invoke(DispatcherPriority.Input, new Action(() =>
      {
        LocallyDisableMousePointerVanish();
      });
  });
}

08-04 17:29