Laden...

Rectangle von Rechner-Fenster anzeigen

Erstellt von helios300 vor 2 Jahren Letzter Beitrag vor 2 Jahren 442 Views
H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren
Rectangle von Rechner-Fenster anzeigen

Hallo liebe Community,

ich melde mich wieder mit einer Frage..
Ich möchte die Rectangle-Werte von dem Rechner Fenster anzeigen lassen.. doch wenn ich den Button klicke, bekomme ich für alle 4 Parameter den Wert 0.


        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string strClassName, string strWindowName);

        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);

        public struct Rect
        {
            public int Left { get; set; }
            public int Top { get; set; }
            public int Right { get; set; }
            public int Bottom { get; set; }
        }

......

       public static void RechnerWindowLocation()
        {
            Process[] processes = Process.GetProcessesByName("Calculator"); 
            Process lol = processes[0];                                                          
            IntPtr ptr = lol.MainWindowHandle;                                            
            Rect NotepadRect = new Rect();
            GetWindowRect(ptr, ref NotepadRect);
            MessageBox.Show($"Left:{NotepadRect.Left} Right:{NotepadRect.Right} Top:{NotepadRect.Top} Bottom:{NotepadRect.Bottom}");
        }

        private void button1_Click(object sender, EventArgs e)
        {
           RechnerWindowLocation();
        }

Der Code funktioniert zwar.. doch ich bekomme die Werte " Left:0 Right:0 Top:0 Bottom:0 "

Kann mir jemand verraten, was ich falsch mache?

Vielen Dank im Voraus !!

Grüße,
h300

16.834 Beiträge seit 2008
vor 2 Jahren

Für die Kommunikation mit der Win32 arbeitet man eigentlich mit Feldern, nicht mit Eigenschaften, daher sollte es (wahrscheinlich) so aussehen:


public struct Rect
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;
}

Was anderes sticht mir aufs erste nicht ins Auge; vor allem da es bei Dir ja wohl auch nur an den Werten liegt und Du sonst kein Fehler bekommst, oder?

H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren

Leider hat das auch nichts gebracht.. bekomme weiterhin keinen Fehler sondern nur den Wert 0 für alle 4 Parameter.

s.a. den Code bei
>

Das habe ich gerade probiert.. funktioniert allerdings nur bei dem eigenen Programm, sprich für Form1.
Wenn ich versuche diese Methode bei einem externen Process anzuwenden, bekomme ich die MessageBox mit "ERROR".

Die Methoden die ich ausprobiert habe:


        public static void RechnerWindowLocation()
        {
            Process[] processes = Process.GetProcessesByName("Calculator");
            Process lol = processes[0];
            IntPtr ptr = lol.MainWindowHandle;
            Rect NotepadRect = new Rect();
            GetWindowRect(ptr, ref NotepadRect);
            MessageBox.Show($"Left:{NotepadRect.Left} Right:{NotepadRect.Right} Top:{NotepadRect.Top} Bottom:{NotepadRect.Bottom}");
        }

        public static void RechnerWindowLocationZwei()
        {
            Rect rct;
            Rectangle myRect = new Rectangle();
            Process[] processes = Process.GetProcessesByName("Calculator");
            Process lol = processes[0];
            IntPtr ptr = lol.MainWindowHandle;
            Rect NotepadRect = new Rect();

            if (!GetWindowRect(ptr, ref NotepadRect));
            {
                MessageBox.Show("ERROR");
                return;
            }
            MessageBox.Show(rct.ToString());

            myRect.X = rct.Left;
            myRect.Y = rct.Top;
            myRect.Width = rct.Right - rct.Left + 1;
            myRect.Height = rct.Bottom - rct.Top + 1;
        }

T
9 Beiträge seit 2021
vor 2 Jahren

'Morgen,
das scheint was Windows 10 - spezifisches zu sein. Unter Vista funktioniert der Code mit der Korrektur von Abt aus Post2.

  • Tommix
S
248 Beiträge seit 2008
vor 2 Jahren

Hallo,

du solltest prüfen ob MainWindowHandle auch ein gültiges Handle oder IntPtr.Zero zurück gibt.
Das wird vermutlich das Problem sein.
Hier könntest du eine Lösung finden: Process.MainWindowHandle returns 0 for too many processes

Grüße

H
helios300 Themenstarter:in
11 Beiträge seit 2021
vor 2 Jahren

Ich habe mein Code jetzt dementsprechend angepasst und nun funktioniert es:


public static void RechnerWindowLocation()
        {
            IntPtr hwnd = FindWindow(null, "Rechner");
            Rect NotepadRect = new Rect();
            GetWindowRect(hwnd, ref NotepadRect);
            MessageBox.Show($"Left:{NotepadRect.Left} Right:{NotepadRect.Right} Top:{NotepadRect.Top} Bottom:{NotepadRect.Bottom}");
        }

        

        private void button1_Click(object sender, EventArgs e)
        {
            RechnerWindowLocation();
        }

Danke an alle für die Hilfe!

Hinweis von Abt vor 2 Jahren

Bitte keine Full Quotes
[Hinweis] Wie poste ich richtig?