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
Rectangle von Rechner-Fenster anzeigen
helios300
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

Rectangle von Rechner-Fenster anzeigen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16223

beantworten | zitieren | melden

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?
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4193

beantworten | zitieren | melden

s.a. den Code bei PInvoke.net: GetWindowRect
private Nachricht | Beiträge des Benutzers
helios300
myCSharp.de - Member



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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

Zitat von Th69
s.a. den Code bei PInvoke.net: GetWindowRect

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



Dabei seit:
Beiträge: 6

beantworten | zitieren | melden

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

- Tommix
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 242
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

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



Dabei seit:
Beiträge: 11

Themenstarter:

beantworten | zitieren | melden

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!

Moderationshinweis von Abt (07.10.2021 - 19:36:45):

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

private Nachricht | Beiträge des Benutzers