0

マウスホイールを使用してVista64マシンでWPFToolkitDataGridをスクロールすると、不可解な低レベルエラーが発生します。

   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に問題を記録しました。

しかし、誰かがこれを解決する方法をすでに見つけましたか?

4

2 に答える 2

1

私は自分でこの問題に遭遇しました。

それがまだあなたにとって役立つかどうかはわかりませんが、他の誰かがそれを必要とする場合に備えて、私が見つけた修正があります.

OpenTK プロジェクトでこのスレッドを見つけましたが、これは、Vista 64 マシンの WPF プロジェクトで抱えていた問題とよく似たにおいがしました。そのスレッドで説明されているように、この問題は、MouseWheel メッセージの wParam の誤った処理ビットのようです。wParam IntPtr を int にキャストしようとすると、HwndMouseInputProvider 呼び出しでオーバーフロー例外が発生します。

したがって、回避策は、メイン ウィンドウでウィンドウ メッセージをフィルター処理するためのフックを追加することです。フック コールバックは、WM_MOUSEWHEEL メッセージの wparam の値をチェックします。値がオーバーフローすると、値シフターが適切なビット情報を回復し、現在のメッセージが処理済みとしてマークされ、新しいメッセージが新しい値でポストされます。

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

于 2010-10-15T20:58:19.333 に答える
0

このバグは Microsoft のライブラリ内にあり、まだそこにあるとは信じられません。

Visual Studio があり、開発者であると仮定して回避するには、次のようにします。

プロジェクトを右クリックして、[プロパティ] を選択します。

[ビルド] タブを選択します。プラットフォーム ターゲット: x86

次に、プロジェクトを再構築します。

バックグラウンド:

32ビットOSで動作する完全に優れたプログラムがありました。それから、Windows 7 64 ビット OS を搭載した新しいラップトップを購入しました。Visual Studio と私のソリューションをインストールしました。Windows メッセージを処理して WndProc でユーザー入力を処理する 1 つのプロジェクトが失敗しました。あなたのものは、マウスメッセージの処理に似ています。

Microsoft の Visual Studio チームによるパッチが見つからなかったため、プラットフォーム ターゲットを「任意の CPU」から「x86」に変更し、64 ビット OS に再デプロイしたところ、プログラムが正しく動作することがわかりました。変更点はこれだけでした。

于 2010-05-22T15:58:25.243 に答える