在Windows中自动完成文本框和“在键入时隐藏指针”

如何通过应用程序禁用“键入时隐藏指针”选项? 我遇到了光标隐藏的问题,没有按下转义或丢失窗口焦点而没有将其恢复。 该应用程序是用C#编写的,并使用WPF。 不需要技术特定的答案,因为它可能使用任何技术。

这是场景:用户可以键入TextBox,并在框下方显示自动完成列表。 一旦用户开始输入,他/她就不能再从下拉列表中选择项目,因为没有鼠标光标。

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

任何帮助是极大的赞赏!

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

两种可能的方案:

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

在用户开始在文本框中键入之前,可以随时执行其中任何一项操作。

以下是reflection解决方案的外观:

 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(); }); }); } 

看起来像win api函数SystemParametersInfo会做你需要的; 控制指针消失function的参数是:

SPI_GETMOUSEVANISH和SPI_SETMOUSEVANISH

Windows Me和Windows XP添加了Mouse Vanish辅助function。 此function在用户键入时隐藏指针。 当用户移动鼠标时,鼠标指针重新出现。 此function可防止指针模糊正在键入的文本,例如,在电子邮件或其他文档中。

检查SystemParametersInfo在msdn上的函数描述以获取更多信息