GetWindowRect liefert negative Koordinaten



  • Ich habe ein kleines Verständnisproblem mit der Funktion GetWindowRect(). Und zwar habe ich eine Funktion geschrieben welche mir periodisch die Koordinaten eines fremden Prozesses (Notepad) ausgibt. Dazu habe ich einen Timer aufgezogen welcher mir alle 500 ms folgende Funktion aufruft.

    LRESULT OnTimer(HWND hWnd, UINT Id)  // siehe <windowsx.h>
    {
      //if (!IsIconic(hTargetWnd))  // hTargetWnd -> Handle auf Fenster des fremden Prozesses
      {
        GetWindowRect(hTargetWnd, &TargetRect);
        printf("b=%i l=%i r=%i t=%i\n", TargetRect.bottom, TargetRect.left, TargetRect.right, TargetRect.top);
      }
      return 0;
    }
    

    Nun ist mir aufgefallen dass die Koordinaten in TargetRect negativ werden sobald das Zielfenster hTargetWnd minimiert wird.

    Also habe ich die Abfrage IsIconic() eingebaut und mir die Koordinaten nochmals angeschaut. Und siehe da die negativen Koordinaten sind so gut wie verschwunden. Wenn ich das Zielfenster minimiere, werden keine Koordinaten angezeigt. Wenn ich das Zielfenster maximiere, werden die Koordinaten angezeigt.

    Aber wenn ich das mehrmals hintereinander mache (cirka 5 mal), kann ich beobachten dass ab und zu mal trotzdem eine einzelne negative Koordinate angezeigt wird, wenn ich das minimierte Zielfenster maximieren möchte.

    Woran liegt das ? 😕 Und was bedeuten negative Koordinaten ? 😕


  • Mod

    Wer sagt, dass negative Koordnaten falsch sind?
    Meines Wissens nach tritt dies gerne bei maximierten Fenstern auf, damit der Rand nicht im sichtbaren Bereich liegt.

    Negative Koordinaten sind nichts böses oder verbotenes.



  • Sind nicht auch Koordinaten, die auf einem zweiten Monitor auf der linken Seite vom primären Monitor liegen, negativ?



  • @Martin Richter:
    Ich wollte gar nicht ausdrücken dass negative Koordinaten böse sind. Soweit wie ich die WinAPI verstanden habe, liegt doch der Nullpunkt in der linken oberen Ecke des primären Monitors. Und daher kann man schnell auf negative Koordinaten kommen.

    Aber was mich halt ein wenig verwundert ist dass die Funktion GetWindowRect beim deminimieren manchmal einmalig noch die Koordinaten herausgibt, wie ich sie sehe wenn das Fenster minimiert ist und ich dann GetWindowRect() aufrufe.

    Ich habe jetzt einen Workaround implementiert. Wenn die Funktion feststellt dass das Zielfenster minimiert ist, wartet diese eine Sekunde bevor sie die Fensterkoordinaten feststellen will.


  • Mod

    Wenn eine Applikation minimiert wird, heißt das bei den heutigen Fenster Managern, dass sie einfach nur auf SW_HIDE gesetzt sind. Die Koordinaten belieben oft genug unverändert....


Anmelden zum Antworten