Ich versuche zu erkennen, wenn die Maus die Titelleiste von VS 2017 erreicht, aber ich habe festgestellt, dass die Ereignisse MouseEnter
und MouseLeave
nicht korrekt funktionieren. Ereignis wird nur ausgelöst, wenn die Maus die untergeordneten Steuerelemente eingibt, die im folgenden Screenshot durch ein grünes Rechteck gekennzeichnet sind.
Die Titelleiste ist ein DockPanel
mit einigen Elementen. Ich habe den Hintergrund auf SolidColorBrush(Colors.Red)
gesetzt, um sicherzustellen, dass der Treffertest korrekt ausgeführt wird. Wenn die Maus über den Elementen im grünen Rechteck ist IsMouseOver
gibt korrekt zurück, aber überall sonst ist es falsch. In der Menüleiste funktionieren die Ereignisse IsMouseOver
und MouseEnter
und MouseLeave
ordnungsgemäß. Was könnte da falsch sein?
Update 2: Es ist wahrscheinlich, dass die Titelleiste als Nicht-Client-Bereich markiert ist, und dies ist die Ursache für dieses Problem
Aktualisierung:
Hier ist der Visual Tree des VS-Hauptfensters:
Decompiled MainWindowTitleBar
class:
Extrahiertes XAML für MainWindowTitleBar
:
Meine ursprüngliche Antwort konnte Nicht-Client-Mausbewegungen erkennen, aber nicht, wenn die Maus ging. Basierend auf der Feststellung des OP, hierfür TrackMouseEvent
verwenden zu müssen, habe ich meine Antwort aktualisiert, um ein voll funktionsfähiges Beispiel zu zeigen.
Wie in den Kommentaren erwähnt, behandelt / wickelt WPF keine Ereignisse außerhalb des Kundenbereichs. Ich kann keine Erklärung dafür finden, warum. Es ist jedoch möglich, die Mausbewegung (und somit die Mauseingabe) mit einem Nachrichten-Hook zu erkennen.
Von innerhalb einer VS-Erweiterung wird der Hook mit diesem eingeleitet:
%Vor%Der unterstützende Code ist:
%Vor%Tags und Links wpf .net c# visual-studio-2017 visual-studio-extensions