2009-08-26 1 views
0

Wenn ich mit dem Mausrad des WPF Toolkit Datagrid auf einer Vista-64-Maschine scrollen erhalte ich einen kryptischen Fehler niedrigen Niveaus:Wie kann ich den Überlauf vermeiden, wenn das Rad scolling WPF Datagrid

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) 

ich ein issue on CodePlex angemeldet .

Aber hat jemand schon einen Weg gefunden, das zu lösen?

Antwort

0

Dieser Fehler ist in Microsofts Bibliotheken und es ist unglaublich, dass es immer noch da ist.

zu umgehen es Sie haben Visual Studio vorausgesetzt, und Sie sind der Entwickler:

rechts auf das Projekt klicken und wählen Sie -> Eigenschaften

Wählen Sie die Registerkarte Erstellen. Platform Target: x86

Dann das Projekt neu erstellen.

Hintergrund:

hatte ich ein ganz gutes Programm arbeitet auf 32-Bit-Betriebssystemen. Dann kaufte ich einen neuen Laptop mit Windows 7 64 Bit OS. Installierte Visual Studio und meine Lösungen. Ein Projekt, das Windows-Meldungen verarbeitet, um Benutzereingaben mit WndProc zu verarbeiten, ist fehlgeschlagen. Ihnen ist ähnlich, Maus-Nachrichten zu verarbeiten.

Nachdem ich kein Patch von Visual Studio von Microsoft gefunden hatte, änderte ich das Plattformziel von "Any CPU" auf "x86", setzte es auf das 64 Bit Betriebssystem um und sah das Programm korrekt arbeiten. Dies war die einzige Veränderung.

0

Ich laufe gerade in dieses Problem selbst.

Nicht sicher, ob es noch nützlich für Sie ist, aber hier ist die Lösung, die ich gefunden habe, falls jemand anderes es auch benötigt.

Ich fand this Thread im OpenTK-Projekt, das sehr nach dem Problem roch, das ich für ein WPF-Projekt in einer Vista 64-Maschine hatte. Wie in diesem Thread erläutert, scheint das Problem ein misshandeltes Sing-Bit auf dem wParam der MouseWheel-Nachricht zu sein. Die Überlaufausnahme tritt beim Aufruf von HwndMouseInputProvider auf, wenn versucht wird, den wParam IntPtr auf einen int zu konvertieren.

Also die Problemumgehung ist das Hinzufügen eines Hooks zum Filtern von Windows-Nachrichten im Hauptfenster. Der Hook-Rückruf überprüft den Wert von Wparam für die WM_MOUSEWHEEL-Nachricht. Wenn der Wert überläuft, wird der Wertumschalter umherwandern, um die richtige Bit-Information wiederherzustellen, die aktuelle Nachricht wird als behandelt markiert, und eine neue Nachricht wird mit dem neuen Wert gepostet.

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; 
    } 

Das funktioniert gut für mich. Wenn jemand etwas hinzufügen oder korrigieren kann, wäre das großartig! K

Verwandte Themen