Abrufen der Fenstergröße ohne Windows-Schatten

8

Ich versuche Desktop-Fenster in C # zu erfassen, basierend auf Fenster-Handles. Ich benutze .NET und benutze PInvoke um GetWindowRect () um das Fensterrechteck zu erfassen. Ich habe die Fensterauswahl und die Rechteckaufnahme funktioniert gut.

Die erfassten Fensterrechtecke beinhalten jedoch nicht nur die tatsächliche Fenstergröße, sondern auch die Verzierungen des Fensters, wie den Schatten um ihn herum. Wenn ich versuche, das Fenster auf eine Bitmap zu schneiden, enthält die Bitmap die Fläche und den Schatten. Unter Windows 10 erhalte ich den transparenten Schattenbereich einschließlich aller Inhalte, die unter dem aktiven Fenster sichtbar sein könnten:

Der von mir verwendete Code ist einfach genug, um das Fenster mit Win32 GetWindowRect () über PInvoke call einzufangen:

%Vor%

Ich nehme dann das Bild auf und weise es einer Bildbox zu.

Außerdem sieht es so aus, als gäbe es Unterschiede zwischen Fenstern - einige Fenster haben Schatten, andere nicht. Die meisten tun es, aber manche wie Visual Studio und Chrome nicht, also ist es nicht einmal eine einfache Sache, die fremden Pixel zu entfernen.

Ich habe versucht, GetClientRect () zu verwenden, aber das bringt mir nur den Client-Bereich, der nicht das ist, wonach ich gesucht habe. Was ich gerne haben möchte, ist das eigentliche Fensterrechteck mit Rahmen, aber ohne die Schatten.

Gibt es das überhaupt?

    
Rick Strahl 22.08.2015, 18:55
quelle

1 Antwort

1

Ich verwende Windows 10 und stolperte über das gleiche Problem beim Schreiben einer App, um Fenster am oberen oder unteren Bildschirmrand zu öffnen. Ich habe gefunden, dass DwmGetWindowAttribute () funktioniert. Es gibt einen RECT mit etwas anderen Werten als GetWindowRect () ...

zurück

Ergebnisse aus einem Beispielfenster:

GetWindowRect (): {X = 88, Y = 26, Breite = 871, Höhe = 363}

DwmGetWindowAttribute (): {X = 95, Y = 26, Breite = 857, Höhe = 356}

Meine Tests haben gezeigt, dass GetWindowRect () die Verzierungen enthielt, während DwmGetWindowAttribute () dies nicht tat.

Wenn Sie in einem Fenster mit Verzierungen identische Ergebnisse von beiden Methoden erhalten, kann es sein, dass dieses bestimmte Fenster seine eigenen Verzierungen zeichnet oder dass ein anderes Attribut oder eine andere Eigenschaftenmenge für das Fenster festgelegt wird in Betracht ziehen.

    
dynamichael 18.09.2015 06:22
quelle

Tags und Links