Я сам столкнулся с этой проблемой.
Не уверен, что это все еще полезно для вас, но вот исправление, которое я нашел на тот случай, если кому-то еще это понадобится.
Я нашел этот поток в проекте OpenTK, который пах очень похоже на проблему, с которой я столкнулся в проекте WPF на машине Vista 64. Как объяснено в этой теме, проблема, похоже, заключается в том, что бит wiparam сообщения MouseWheel неправильно обработан. Исключение переполнения возникает в вызове HwndMouseInputProvider, когда он пытается преобразовать wParam IntPtr в тип int.
Так что обходной путь - это добавить ловушку для фильтрации сообщений окон в главном окне. Обратный вызов ловушки проверяет значение wparam для сообщения WM_MOUSEWHEEL. Если значение переполняется, то значение сдвигается вокруг для восстановления правильной битовой информации, текущее сообщение помечается как обработанное, и новое сообщение публикуется с новым значением.
public partial class Window1 : Window
{
private const int WM_MOUSEWHEEL = 0x020A;
public Window1()
{
InitializeComponent();
SourceInitialized += (o, e) =>
{
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
source.AddHook(WndProc);
};
}
[DllImport("user32.dll")]
private static extern IntPtr PostMessage(IntPtr hwnd, IntPtr msg, IntPtr wParam, IntPtr lParam);
private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
switch (msg)
{
case WM_MOUSEWHEEL:
// Check that wParam won't cause an OverflowException
if ((long)wParam >= (long)Int32.MaxValue)
{
// Filter the evenet
handled = true;
HwndSource source = PresentationSource.FromVisual(this) as HwndSource;
// Repost the event with the proper value
PostMessage(source.Handle, new IntPtr(msg), new IntPtr((long)wParam << 32 >> 32), lParam);
}
break;
}
return IntPtr.Zero;
}
Это хорошо работает для меня. Если кто-то может добавить или исправить что-нибудь, было бы здорово!
K