IsMouseOver gibt für einige Elemente in einem DockPanel den Wert false zurück

9

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:

%Vor%

Extrahiertes XAML für MainWindowTitleBar :

%Vor%     
Poma 29.06.2017, 06:10
quelle

1 Antwort

1

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%     
cokeman19 02.07.2017, 17:10
quelle