Maus-Rad-event für die Arbeit mit schwebte Kontrolle
In meinem C# 3.5-Windows Forms-Anwendung, habe ich ein paar SplitContainers. Es gibt ein list-Steuerelement in jede (dock) füllen. Wenn der Fokus auf eines dieser Steuerelemente, und ich bewege die Maus-Rad, die Liste, die ist jetzt konzentriert, gescrollt wird.
Meine Aufgabe ist es, Blättern Sie durch die Liste, die ist momentan schwebte Sie durch Maus, nicht das man was ausgewählt ist. Ist es möglich in Windows Forms? Wenn nicht, ist es möglich, mit PInvoke?
- Es scheint, dass Sie aus "scrollen, was die Maus über" das standard-Verhalten in Windows 10. Das ist irgendwie nervig in den meisten Fällen tatsächlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es sieht aus wie Sie verwenden können, die
IMessageFilter
und PInvoke, um diese zu bewältigen. Ein Beispiel in VB finden Sie unter Redirect Mausrad-Ereignisse zu Unkonzentriert Windows Forms-Steuerelemente. Sie sollten in der Lage sein leicht umwandeln diese in C#.Punkte von Interesse
Diese Klasse verwendet die folgenden Techniken, die für die gegebene Aufgabe:
Mit ein VB.NET zu C# Konverter, das ist, was Sie am Ende mit:
WM_MOUSEWHEEL
auf die Kontrolle, wie Sie sollten. Irgendwelche Ideen auf, wie man umgehen?Ich hatte ähnliche Frage und diesen thread gefunden... also die Veröffentlichung meiner verspäteten Antwort für andere, die vielleicht diesen thread. In meinem Fall, ich möchte nur, dass die Mausrad-events zu gehen, um was auch immer-Steuerelement unter dem Mauszeiger befindet... genauso wie mit der rechten Maustaste hat (es wäre verwirrend, wenn mit der rechten Maustaste klicken Sie auf ging zu die Fokus-Kontrolle ist besser als das Steuerelement unter dem Mauszeiger... ich argumentieren, das gleiche gilt für die Maus-Rad, außer wir haben uns daran gewöhnt).
Sowieso, die Antwort ist super einfach. Fügen Sie einfach ein PreFilterMessage zu Ihrer Anwendung und haben es umleiten Mausrad-events an das control unter der Maus:
[DllImport("user32.dll")] static extern IntPtr WindowFromPoint(Point p);[DllImport("user32.dll", CharSet = CharSet.Auto)] static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
Auch, PreFilterMessage() kommt von IMessageFilter, und dass die Umsetzung übergeben werden mussApplicationAddMessageFilter()
. Sobald das erledigt ist, werden alle Platten in meinem app wurde scrollbaren unter der Maus. Jedoch, Doppelklick nicht mehr markiert text. Seltsam.Verwenden Kontrolle.MouseEnter-Ereignis, setzen Sie den Fokus auf die Steuerung. E. g. mit ActiveControl-Eigenschaft
Dies ist Brian Kennedy's Antwort abgeschlossen mit Hank Schultz Kommentar:
Zuallererst sollte man eine Klasse implementiert IMessageFilter:
Beispiel: