Как можно избежать переполнения при смещении колес WPF DataGrid - PullRequest
0 голосов
/ 26 августа 2009

Когда я использую колесо мыши для прокрутки таблицы данных WPF Toolkit на компьютере с Vista 64, я получаю загадочную ошибку низкого уровня:

   at System.IntPtr.op_Explicit(IntPtr value)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)

Я зарегистрировал проблему на CodePlex .

Но кто-нибудь уже нашел способ решить эту проблему?

Ответы [ 2 ]

1 голос
/ 16 октября 2010

Я сам столкнулся с этой проблемой.

Не уверен, что это все еще полезно для вас, но вот исправление, которое я нашел на тот случай, если кому-то еще это понадобится.

Я нашел этот поток в проекте 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

0 голосов
/ 22 мая 2010

Эта ошибка находится в библиотеках Microsoft, и невероятно, что она все еще там.

Чтобы обойти это, предположим, что у вас есть Visual Studio и вы разработчик:

Щелкните правой кнопкой мыши по проекту и выберите -> Свойства

Выберите вкладку Build. Платформа Цель: x86

Затем пересоберите проект.

Справочная информация:

У меня была очень хорошая программа, работающая на 32-битных ОС. Тогда я купил новый ноутбук с Windows 7 64-битной ОС. Установил Visual Studio и мои решения. Один проект, который обрабатывает сообщения Windows для обработки пользовательского ввода с WndProc, потерпел неудачу. Ваша аналогичная обработка сообщений мыши.

После того, как команда Microsoft Visual Studio не нашла патч, я изменил цель платформы с «Любой ЦП» на «x86», повторно развернул ее на 64-битной ОС и увидел, что программа работает правильно. Это было единственное изменение.

...