Position und Größe eines Fensters abfragen



  • Hallo,

    wie kann man die Größe und die Position eines beliebigen Fensters abfragen?

    Mit ratlosen Grüßen
    DerRatlose



  • Mit der API-Funktion GetWindowRect(HWND,LPRECT). Die zurückgelieferten Koordinaten beziehen sich auf den Bildschirm; wenn du die Position eines untergeordneten Fensters im Bezug auf das übergeordnete brauchst, mußt du die Koordinaten noch mit MapWindowPoints() konvertieren.

    Gruß,

    VV 🙂



  • Sorry, damit kann ich nicht sooo viel anfangen. So gut kenne ich mich nicht mit der WinAPI aus.

    Kannst du mir ein Codebeispiel geben?

    Mit freundlichen Grüßen
    DerRatlose



  • Wie sieht dein Programm bisher aus - hast du schon die Grundstruktur eines GUI-Programms mit Fensterklasse, Fenster erzeugen, MessageLoop...? Welchen Compiler benutzt du? Hat das Programm bzw. die Fensterabfrage einen bestimmten Zweck möchtest du es einfach zu Lernzwecken ausprobieren?



  • Das ganze soll für Lernzwecke sein. Einfach, um etwas dazuzulernen.
    Ich benutze den MinGW.
    Ich glaube, du verstehst mich falsch. Ich will nicht abfragen, wo mein eigenes Fenster ist. Ich will wissen, wo sich ein anderes Fenster von einem anderen Programm befindet.

    Mit freundlichen Grüßen
    DerRatlose



  • Es macht keinen Unterschied, ob du dein eigenes oder ein anderes Fenster abfragst. Grundsätzlich geht das so:

    #include <windows.h>
    
    HWND Handle;
    RECT Rect;
    
    // weise der Variablen Handle hier das HWND des gewünschten Fensters zu...
    
    ::GetWindowRect(Handle,&Rect);
    
    // die Koordinaten befinden sich jetzt in der RECT-Struktur
    

    Falls irgendetwas daran noch unklar sein sollte, empfehle ich dir, die Grundlagen der Fensterverwaltung unter Windows bei MSDN nachzulesen...

    Gruß,

    VV 🙂



  • Danke, für den Code. Hat mir schon ein bisschen weitergeholfen.

    Werde in der MSDN mal nachschauen. Kannst du mir evtl. noch sagen, wie ich in der MSDN am einfachsten finde, was ich suche?
    Wenn ich in die Suche "Fensterverwaltung" eingebe, bekomme ich seitenweise Ergebnisse...

    Mit freundlichen Grüßen
    DerRatlose



  • Schau mal unter "EnumWindows"



  • Ja, die MSDN ist leider riesengroß und unübersichtlich...hier ein Link zum entsprechenden Kapitel:

    http://msdn.microsoft.com/en-us/library/ms632595(VS.85).aspx

    In einem anderen Thread habe ich zufällig noch diesen Link entdeckt, der für dich auch interessant sein könnte:

    http://www.win-api.de/tutorials.php

    Viel Erfolg erst mal...

    Gruß,

    VV 🙂



  • Habe es jetzt so gelöst:

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    int main() {
       HWND hwnd = FindWindow(NULL,"Fenstername");
       RECT rect;
    
       while(true) {
          GetWindowRect(hwnd, &rect);
    
          cout<< "X: " << rect.left << endl
              << "Y: " << rect.top << endl
              << "X + Fensterbreite: " << rect.right << endl
              << "Y + Fensterhoehe: " << rect.bottom;
    
          system("cls");
       }
    
       return 0;
    }
    

    Hatte den Code im Internet gefunden und musst ihn dann nur noch ein bisschen anpassen. Habe auch fast verstanden, wie das ganze funktionert.
    Aber wofür sind die beiden Parameter von FindWindow()? Wenn ich den ersten auf NULL setze und bei dem zweiten den Namen eines Fenster angebe, greift das Programm später auf die Position des entsprechenden Fensters zurück.
    Aber was ist mit dem ersten Parameter, wenn ich dort etwas eingebe und den zweiten auf NULL setze? Was kann ich damit bezwecken? Und gibt es auch einen Fall, bei dem keiner der beiden Parameter mit NULL belegt wird?

    Mit freundlichen Grüßen
    DerRatlose



  • In die MSDN guggen, wenn du Winapi proggen möchtes gewöhn dich dran, die MSDN ist dein bester Freund.

    FindWindow
    The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows. This function does not perform a case-sensitive search.

    HWND FindWindow(
    LPCTSTR lpClassName, // pointer to class name
    LPCTSTR lpWindowName // pointer to window name
    );

    Parameters
    lpClassName
    Pointer to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to theGlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpClassName; the high-order word must be zero.
    lpWindowName
    Pointer to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.



  • Ich werde aus dem ersten Parameter immer noch nicht schlau 😞
    Kann mir jemand erklären, wofür der da ist, evtl. mit einem Beispiel?

    Mit freundlichen Grüßen
    DerRatlose



  • da kann einfach der Name der Fensterklasse stehen. Die findet man zB mit Spy++ raus.

    greetz KN4CK3R



  • Ok, danke.

    Mit freundlichen Grüßen
    DerRatlose


Anmelden zum Antworten