Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie bekomme ich Fenstergröße mit einem Window-Handle?
nico2009
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

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

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von nico2009 am .
private Nachricht | Beiträge des Benutzers
proper_csharp
myCSharp.de - Member



Dabei seit:
Beiträge: 60
Herkunft: D / Lkr. FFB (Bayern)

beantworten | zitieren | melden

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 ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von proper_csharp am .
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

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 :)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von michlG am .
private Nachricht | Beiträge des Benutzers
progi123
myCSharp.de - Member

Avatar #avatar-3317.gif


Dabei seit:
Beiträge: 71
Herkunft: Süddeutschland

beantworten | zitieren | melden

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; 
}
private Nachricht | Beiträge des Benutzers
nico2009
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

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);
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von nico2009 am .
private Nachricht | Beiträge des Benutzers
proper_csharp
myCSharp.de - Member



Dabei seit:
Beiträge: 60
Herkunft: D / Lkr. FFB (Bayern)

beantworten | zitieren | melden

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ß
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von proper_csharp am .
private Nachricht | Beiträge des Benutzers
nico2009
myCSharp.de - Member



Dabei seit:
Beiträge: 3

Themenstarter:

beantworten | zitieren | melden

OK, so funktioniert es! Danke für eure schnelle Hilfe.
private Nachricht | Beiträge des Benutzers