在我的WPF应用程序(.net 4.0)上,在没有物理鼠标(仅触摸屏)的设备上,用户在Combobox中选择了一个值。 6分钟“不活动”后(用户或软件没有动作) 提出了一个例外:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Windows.Input.StylusDevice.GetMouseButtonState(MouseButton mouseButton, MouseDevice mouseDevice)
at System.Windows.Controls.ComboBox.OnAutoScrollTimeout(Object sender, EventArgs e)
at System.Windows.Threading.DispatcherTimer.FireTick(Object unused)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
似乎在用户说明重现该错误后,当usb键盘连接到设备时出现此异常。
我无法重现该错误。 在谷歌搜索没有给我任何线索
我在反编译的4.0框架代码(我没有找到4.0可下载的源代码)和源浏览器(框架4.6)上看到了一些导致:
private void OnAutoScrollTimeout(object sender, EventArgs e)
{
if (Mouse.LeftButton != MouseButtonState.Pressed || !this.HasMouseEnteredItemsHost)
return;
this.DoAutoScroll(this.HighlightedInfo);
}
问题似乎来自:
public MouseButtonState LeftButton
{
get
{
return GetButtonState(MouseButton.Left);
}
}
protected MouseButtonState GetButtonState(MouseButton mouseButton)
{
//
if ( _stylusDevice != null && _stylusDevice.IsValid)
return _stylusDevice.GetMouseButtonState(mouseButton, this);
else
return GetButtonStateFromSystem(mouseButton);
}
[SecurityCritical, SecurityTreatAsSafe]
internal MouseButtonState GetMouseButtonState(MouseButton mouseButton, MouseDevice mouseDevice)
{
if (mouseButton == MouseButton.Left)
{
return _stylusLogic.GetMouseLeftOrRightButtonState(true);
}
if (mouseButton == MouseButton.Right)
{
return _stylusLogic.GetMouseLeftOrRightButtonState(false);
}
// can defer back to the mouse device that called you and it will call Win32
return mouseDevice.GetButtonStateFromSystem(mouseButton);
}
很明显,代码在框架版本之间发生了变化,但即使某些更改可能会影响此代码,我也看不到可能发生空引用异常的位置。
有人能帮助我吗?
由于
更新: 经过更多的调查,我找到了答案的一部分。 在USB上连接键盘时,它会影响位于同一硬件Usb内部集线器上的触摸屏。 看来windows在这一刻就丢失了,而且“鼠标”的管理受到了影响......