应用程序如何禁用“键入时隐藏指针”选项?我遇到了一个隐藏光标的问题,即在不按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();
});
});
}