Announcement

Collapse
No announcement yet.

GetPixel mit Handle von transparentem Panel?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    Code:
      // Maus innerhalb des transparenten Panels über die Anwendung bewegen
      SetCursorPos( MoveMouseX, MoveMouseY );
      Sleep(1);
    
      // Handle vom Fenster
      HWND hWindow = WindowFromPoint(Mouse->CursorPos);
    
      // Position der Anwendung
      RECT r;
      ::GetWindowRect(hWindow, &r);
    
      // Was bringt mir die Position jetzt, wenn ich den Cursor suche?
      // wichtig: GetCursorPos() liefert nicht die Position des Cursors innerhalb der Anwendung!
      // selbst wenn die Anwendung bei 0,0 liegen würde, wäre es bis zu +-55 Pixel unterschied
    
      // handle of a display device context (DC)
      HDC dc = GetDC(hWindow);
    
      // [...] GetPixel ... etc.
    
      // handle of display device context (DC) freigeben
      ReleaseDC(hWindow, dc);
    Ich komm i-wie nicht mehr weiter. =(

    Comment


    • #17
      Ich sehe da keinen Code? Wo ist die Berechnung?
      Christian

      Comment


      • #18
        Du verstehst das Problem noch nicht, oder?

        Mit dem GetWindowRect hab ich ja 'Left' und 'Top' der Anwendung.
        => Mouse->Left - Anwendungs->Left = Position der Maus innerhalb der Awendung
        ... mit 'Top' halt das gleiche... aber dann fehlt mir immernoch die Differenz zur Maus in der Anwendung.

        Comment


        • #19
          Du verstehst das Problem noch nicht, oder?
          Wenn du meinst....

          Mir ist unklar wie ohne eine Zeile Code festgestellt werden kann, dass Abweichungen vorhanden sind. Noch dazu mit schnell wechelnden Koordinaten die offenbar über ein Move-Ereignis kommen.

          Und man hätte von oben die Funktion
          Screento Client
          mal ausführen können


          Aber lassen wir es dabei.....
          Zuletzt editiert von Christian Marquardt; 21.05.2012, 16:01.
          Christian

          Comment


          • #20
            Originally posted by Christian Marquardt View Post
            Mir ist unklar wie ohne eine Zeile Code festgestellt werden kann, dass Abweichungen vorhanden sind. [...]
            Man kann es mit dem bloßen Auge erkennen, dass der Cursor einige Pixel wegspringt,
            wenn die Anwendung ihn "ersetzt", während man vom Desktop auf die Anwendung fährt.

            Was nützt mir denn nun die Position der Anwendung, wenn ich die Mausposition brauche?
            GetCursorPos() liefert mir die "falschen" Koordinaten.
            Um eine Differenz ausrechnen zu können bräuchte ich doc erstmal einen Fixpunkt,
            mit dem ich rechnen kann!?

            Comment


            • #21
              Was jetzt noch fehlt, wäre die Möglichkeit herauszufinden, wo sich die Maus in Relation
              zum ausgewählten Fenster befindet.
              D.h. du willst wissen, wenn die Koordinaten der Maus absolut 100 100 sind und das Fenster bei 80 80 liegt willst du als Ergebnis 20 20 haben.


              Dir stehen die hier genannten Funktionen für Fenster zur Verfügung. Sowie die Funktioen ScreentoClient, LogicalToPhysicalPoint, PhysicalToLogicalPoint usw.

              Ich kann weiterhin nicht erkennen wo irgendwas springen könnte, da du die Mausposition vor dem auslesen der Fensterinfos setzt.

              Dein Code macht nur folgendes

              Setze die Maus
              Hole die Fenstergröße an der Maus

              Das ist eine schlechte Teststellung

              Mehr nicht. Wo ist das die Berechnung zur Feststellung wie die Koordinaten im Client sind? Entweder manuell oder mit o.a. Funktion? Nicht mal eine Ausgabe der Koordinaten erfolgt?
              Zuletzt editiert von Christian Marquardt; 21.05.2012, 16:17.
              Christian

              Comment


              • #22
                Originally posted by Christian Marquardt View Post
                D.h. du willst wissen, wenn die Koordinaten der Maus absolut 100 100 sind und das Fenster bei 80 80 liegt willst du als Ergebnis 20 20 haben.
                Du hast das Problem leider wirklich noch nicht erkannt.

                Wenn ich mit dem Cursor manuell von meinem Desktop über das Fenster der Anwendung fahre,
                dann "springt" der Mauszeiger innerhalb der Anwendung auf eine andere Position!

                Dann liefert mir GetCursor() 100,100 (da wo der Mauszeiger ja offiziel sein sollte)
                Aber in der Anwendung befindet sich die Maus eben nicht an dieser Stelle.

                Nach deinem Beispiel von oben:
                - Koordinaten der Maus absolut: 100,100
                - Fenster liegt bei 80,80
                - Maus-Position im Fenster i-wo zwischen 20 plus-minus 55
                => also nicht 20, wie es sein müsste - sondern zwischen 0 und 55 Pixel Abweichung)
                - Beispiel: Ergebnis: 20,20 - Mausliegt aber bei 65,35 <<
                Der MAuszeiger innerhalb der Anwendung hat einfach eine andere Position als er "real" haben sollte.

                Meine Frage bezieht sich also nicht auf die Position des Fensters!


                Code:
                Psydo-Code:
                GetCursorPos(Pos);
                
                // position der maus
                int X = Pos.x;
                int Y = Pos.y;
                
                int MouseX = (X - Anwendungs->Left); // (dein Beispiel: 100 - 80 = 20)
                int Mouse> = (Y - Anwendungs->Left); // soweit war ich auch schon - bringt halt nix
                // Die Maus liegt halt nicht bei 20 sondern bei 65,35 oder bei 5,75, oder bei 10,10, etc.
                Es gibt halt leider keinen Befehl wie diesen:
                GetWindowCursorPosition(HWND window-handle, POINT p);
                window-hande [in]
                p [out]


                Tut mir LEid dich hier so zu nerven, aber ich hoffe du verstehst erstmal wo mein PRoblem liegt.

                Comment


                • #23
                  GetWindowCursorPosition(HWND window-handle, POINT p);
                  Was wäre das für ein Windowhandle? -> ggf. siehe unten

                  - Maus-Position im Fenster i-wo zwischen 20 plus-minus 55
                  => also nicht 20, wie es sein müsste - sondern zwischen 0 und 55 Pixel Abweichung)
                  - Beispiel: Ergebnis: 20,20 - Mausliegt aber bei 65,35 <<
                  Der MAuszeiger innerhalb der Anwendung hat einfach eine andere Position als er "real" haben sollte.
                  Das ist eben meine Frage
                  - wie du das feststellst
                  - warum du dir die Koordinaten nicht von Windows selbst umrechnen lässt

                  Wenn ich mit dem Cursor manuell von meinem Desktop über das Fenster der Anwendung fahre,
                  dann "springt" der Mauszeiger innerhalb der Anwendung auf eine andere Position!
                  passiert bei mir nicht, egal über welche Anwendungen ich fahre.

                  Du hast das Problem leider wirklich noch nicht erkannt.
                  Tja, offenbar und mir wird es wohl auch nicht klar


                  Es gibt eine absolute Mausposition. Ist ein Fenster darunter kann es Bedarf geben die Position relativ zu dem Fenster zu erkennen.

                  Da müsste man das Fenster ermitteln -> WindowFromPoint
                  Die augenblicklichen Koordinaten -> GetCursorPos
                  Beides an ScreenToClient geben und schauen was rauskommt

                  EDIT

                  Und liegt deine transparente Anwendung dazwischen, ist erstmal zu prüfen, ob WindowFromPoint DEINE Anwendung zurückgibt oder tatsächlich die darunterliegende.
                  Zuletzt editiert von Christian Marquardt; 21.05.2012, 17:05.
                  Christian

                  Comment


                  • #24
                    Originally posted by Christian Marquardt View Post
                    Was wäre das für ein Windowhandle?
                    Das von WindowFromPoint.

                    Originally posted by Christian Marquardt View Post
                    Das ist eben meine Frage
                    - wie du das feststellst
                    Screenshot vom Desktop => In Paint die Koordinaten des Mauszeigers ablesen.

                    Originally posted by Christian Marquardt View Post
                    - warum du dir die Koordinaten nicht von Windows selbst umrechnen lässt
                    Hatte ich gestern mehrfach versucht - liefert leider ebenfalls die falschen Ergebnisse.

                    Originally posted by Christian Marquardt View Post
                    passiert bei mir nicht, egal über welche Anwendungen ich fahre.
                    Kennst du das von Adobe Flash Anwendungen, wenn der Mauszeiger optisch verändert wird und dann von der Anwendung selbst "emuliert" wird?
                    So in etwa ist es auch bei dieser Anwendung, aber ich weiß nicht wie es gemacht wird.

                    Kann man i-wie ein "WM_MouseMove" von der Anwendung abfangen und die Parameter darüber holen?
                    Oder geht WM_MouseMove nur für die eigene Anwendung im MessageHandler?

                    Das Handle hab ich überprüft - ist nicht meine Anwendung sondern die darunter.

                    Edit: bin erstmal länger afk - also warte nicht auf meine Antwort ^^

                    Comment


                    • #25
                      http://www.marquardtnet.info/cecke/dlls.3/3_chhook.html

                      Das von WindowFromPoint.
                      Dann sind das die 3 Zeilen, die ich oben skizziert habe
                      Christian

                      Comment


                      • #26
                        danke für den Link zu der DLL.
                        Hab es ausprobiert, aber die Anwendung scheint kein WM_MOUSEMOVE zu senden.

                        Wenn ich Linksklick mache, gibt mir die DLL wie erwartet die gleichen Koordinaten
                        aus, wie es auch GetCursorPos() tun würde.

                        Comment

                        Working...
                        X