Laden...

Wie bekomme ich Fenstergröße mit einem Window-Handle?

Erstellt von nico2009 vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.809 Views
N
nico2009 Themenstarter:in
3 Beiträge seit 2009
vor 14 Jahren
Wie bekomme ich Fenstergröße mit einem Window-Handle?

Hallo!

Ich komm grad irgendwie nicht weiter. Ich hab eine Funktion, der ich einen WindowTitle übergebe und die mir das Handle dieses Windows zurückgibt:


public IntPtr GetWindowHandle(string processNamePart)
{
    Process[] processes = Process.GetProcesses();
    foreach(Process p in processes)
    {
        if(p.MainWindowTitle.Contains(processNamePart))
            return p.MainWindowHandle;
    }

    return new IntPtr(0);    // nicht gefunden
}

Wie kann ich nun mit diesem windowHandle die Größe und Position des zugehörigen Fensters ermitteln? Ich hab dazu bisher keine Möglichkeit in C# gefunden. Wäre nett, wenn mir da jemand weiterhelfen kann.

Gruß, Nico.

P
60 Beiträge seit 2006
vor 14 Jahren

Hallo nico2009,

herzlich willkommen hier.
Auf jeden Fall solltest du mit der normalen API Funktion GetWindowRect die Abmessungen bekommen, denke ich.

Ohne es jetzt direkt per Code ausprobiert zu haben, solltest du die API - Funktion entsprechend deklarieren und dann kannst du sie verwenden.


 [DllImport("user32.dll", SetLastError = true)]
        static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

Gruß

EDIT @michlG
Passt schon - beide Beiträge zusammen machen es erst rund 😉

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo nico2009

versuchs mal so


RECT windowRectangle;
GetWindowRect(windowhandle, out windowRectangle);
int links = windowsRectangle.Left;

Da gibt es die Eigenschaften Left, Right, Top, Bottom, dann musst du dir halt selbst die Größe berechnen.

Gruss
Michael

EDIT:
Oha, da hab ich proper_csharp übersehn, sry 😃

71 Beiträge seit 2008
vor 14 Jahren

Omg. Während ich meine Lösung geschrieben habe, gab es zwei weitere Beiträge.

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}

[DllImport("user32.dll")]
public static extern int GetWindowRect(int hwnd, ref RECT rc);
IntPtr wnd;
RECT rc;
int breite;
int hoehe;
int x;
int y; 

private void GetLocation()
{
int hwnd = wnd.ToInt32();
GetWindowRect(hwnd, ref rc);

breite = rc.right - rc.left;
hoehe = rc.bottom - rc.top;
x = rc.left;
y = rc.top; 
}
N
nico2009 Themenstarter:in
3 Beiträge seit 2009
vor 14 Jahren

Das hab ich so schon probiert. Ich vermute, statt RECT muss bei der Importfunktion Rectangle stehen, oder? Ich verwende es mit Rectangle, da C# RECT bei mir nicht akzeptiert.

Das Problem ist, dass dabei falsche Werte rauskommen. Für das Fenster, für das ich die Position ermitteln will, bekomme ich z.B. immer Left=512, Top=384 raus, egal wo ich das Fenster hinschiebe.

Was mir bisher auch unklar ist, ist wie die Struktur RECT aus Win32, die nur left, top, right & bottom enthält auf das Rectangle von C# gemappt wird, was ja zusätzlich noch X, Y, Width, Height und ein paar andere Werte enthält.

Kann es sein, dass beim Import von GetWindowRect() was schiefgeht? Oder muss ich RECT auch erst noch in C# importieren?

Der Vollständigkeit halber - meine Import-Deklaration sieht im Moment so aus:


[DllImport("user32.dll", SetLastError=true)]
static extern bool GetWindowRect(IntPtr hWnd, out Rectangle lpRect);

P
60 Beiträge seit 2006
vor 14 Jahren

Hallo nico2009,

habe mal folgendes kurz ausprobiert - ich bekomme vernünftige Werte. Die RECT Struktur musst du anlegen, dann geht es.

EDIT:
Siehe auch bei Progi123. Da wäre auch noch eine Konvertierung, falls gewünscht.


       public IntPtr GetWindowHandle(string processNamePart)
        {
            System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process p in processes)
            {
                if (p.MainWindowTitle.Contains(processNamePart))
                    return p.MainWindowHandle;
            }

            return new IntPtr(0);    // nicht gefunden
        }
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }


Dann testweise verwendet (sinnfreier dummy-Code, im Debugger Werte angesehen)


                RECT windowRectangle;
                GetWindowRect(GetWindowHandle("Windows Task-Manager"), out windowRectangle);
                int links = windowRectangle.left; 
                return;

Gruß

N
nico2009 Themenstarter:in
3 Beiträge seit 2009
vor 14 Jahren

OK, so funktioniert es! 😁 Danke für eure schnelle Hilfe.