Rahmenbreite des aktiven Fensters ermitteln

Hallo liebe wer-weiss-was Community,
ich habe ein kleines Problem. Ich möchte gerne die Dimensionen sowie die Rahmenbreite ( Dicke des Rahmens sowie Höhe des Überschriftenbereichs ) des derzeit aktiven Fensters ermitteln (also das was derzeit gefocused ist). Bisher bin ich schon so weit gekommen das ich das aktive Fenster ermittelt habe und die Dimensionen des Fenster mit Rahmen ermitteln kann.

Einziges Problem ich weiß nicht wie ich die Rahmenbreite des Fensters emitteln kann. Gibt es dafür nicht irgendeine API Methode? In VB.NET kann man von der Form die Rahmenbreite ermitteln indem man die SystemInformation Klasse verwendet ( System.Windows.Forms.SystemInformation ). Aber wie mach ich das bei einem Fenster das nicht zum Programm selber gehört?

Was ich bisher habe ist der Prozess des Fensters, die ProzessID, IntPtr, Handle sowie die Dimensionen des Fensters.

Für eine Antwort währe ich sehr dankbar.

Gruß
Wingman223

Wenn du bereits die Höhe und Breite über alles hast, kannst du doch einfach rechnen:

//Rechnet aus, wie breit der Rahmen links, rechts und unten ist
BreiteEinerRahmenSeite = (BreiteGesamt - Form.Size.Width) / 2;

//Rechnet die Höhe der Titelleiste aus
Titelleiste = HoeheGesamt - Form.Size.Height - BreiteEinerRahmenSeite;

Wenn ich mich nicht täusche, bietet Form.Size nämlich nur die Höhe und Breite des Arbeitsbereiches (innerhalb des Rahmens) an.

Sag mir aber bitte noch, wie du die Ausmaße des Fensters „über alles“ ermittelt hast.

LG,

Alexander

Hi Alexander, danke für deine Antwort.
Also klar könnte man einfach davon ausgehen das das Fenster einen bestimmten Stil hat und dann mit den Werten rechnen jedoch gibt es auch Fenster die nen dünneren Kopfbereich haben, vieleicht gar keinen, keinen Rahmen oder Maximiert sind. Dann funktioniert das ja leider nicht mehr aber hast schon recht das wäre zwar keine schöne Lösung aber würde in den meisten Fällen funktionieren.
Es würde ja zumindest reichen zu wissen welchen Stil das Fenster hat, und ich welchem Zustand (Maximiert, Minimiert) es ist dann könnte man vieleicht mit Festwerten rechnen. Vieleicht weiß ja jemand wie man das ermitteln kann.

Sag mir aber bitte noch, wie du die Ausmaße des Fensters „über alles“ ermittelt hast.

Mit Hilfe der API Methode ‚GetWindowRect‘:

 Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hWnd As IntPtr, ByRef lpRect As RECT ) As Boolean 

Einfach IntPtr des Fensters angeben und die Methode gibt dir die Dimensionen des Fensters zurück.

Gruß
Wingman223

Fenster haben, soweit ich weiss, immer denselben Grundaufbau.

Der Rahmen, sofern vorhanden ist doch unten, links und rechts immer gleich breit. Nur die Titelleiste kann unterschiedliche Höhen haben, je nach Theme.

Und alle diese Breiten lassen sich nach der obigen Variante ausrechnen.

FÜr den Fall, dass gar kein Rahmen vorhanden ist, sollte die Rechnung auch stimmen.

Ungleichmäßig geformte Fenster gibt es doch gar nicht, wenn ich mich nicht täusche, weil die Runden Ecken etc. nur durch Transparanz erzeugt werden, oder liege ich da jetzt falsch (ich kenn zB die neue WPF kaum, von daher…)

LG,

Alexander

1 Like

K hab das Problem gelöst. Gab in der selben dll noch eine Methode „GetWindowInfo“ die genau die Werte zurückliefert die ich brauche. Danke nochmal für deine Hilfe Alexander. Hast recht mit dem Arbeitsbereich und der festen Rahmenbreite hätte man das auch berechnen können. Bin dann auf der Suche danach auf die Methode gestoßen.
Die gibt jetzt sogar den Arbeitsbereich mit Position und Größe zurück was heißt das ich das jetzt gar nicht mehr berechnen muss.
Danke nochmal für alles!

Gruß
Wingman223