Announcement

Collapse
No announcement yet.

kann ich mit dem befehl getcaret die position des textcursors herausfinden??

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

  • kann ich mit dem befehl getcaret die position des textcursors herausfinden??

    ich habe im punkt DIVERSES gefragt, wie man die position des textcursors
    in "fremden" programmen herausfinden kann. bedeutet caret = Textcursor???
    kann ich mit dem befehl getcaret die Bildschirmkoordinaten des Textcursors
    auch in "fremden" programmen heraus finden??????

    mfg

    markus lemcke
    Herzliche Grüße

    Markus Lemcke
    barrierefreies Webdesign

  • #2
    Hallo Markus,

    die Win32-API-Funktion <b>GetCaretPos</b> ermittelt die Position des Textcursors bezogen auf das entsprechende Client-Fenster. Das Fensterhandle des aktuellen Programm muss dann ermittelt werden, denn dieses Fensterhandle wird benötigt, wenn die lokalen Koordinaten über die Win32-API-Funktion <b>ClientToScreen</b> in globale Bildschirmkoordinaten umgerechnet werden sollen

    Comment


    • #3
      guten herr kosch,

      ich habe mich gerade in der api umgesehen und schlage folgenden lösungsweg vor und hätte gerne
      gewußt ob er richtig ist:

      mit dem befehl getactivewindow bekomme ich das handle des aktiven fensters.
      dann rufe ich getcaretpos auf und ermittle die koordinaten.
      die wandle ich dann mit clienttoscreen um und kann sie dann meiner lupe übergeben, richtig????

      mfg

      marku
      Herzliche Grüße

      Markus Lemcke
      barrierefreies Webdesign

      Comment


      • #4
        tag herr kosch,

        bei delphi 2 braucht clienttoscreen komischer weise keinen handle.

        folgender versuch ging schief:

        if vergroeserungsbereich = 'lesen/schreiben' then
        begin
        {Handle des aktiven fensters holen}
        handle := GetactiveWindow;
        {Position des Textcursors ermitteln}
        getcaretpos(all);
        {Koordinaten umwandeln}
        pt := ClienttoScreen(all);

        end;

        woran liegt es?????

        mfg

        marku
        Herzliche Grüße

        Markus Lemcke
        barrierefreies Webdesign

        Comment


        • #5
          herr kosch,

          ich habe herausgefunden, daß es 2 clienttoscreen-bezeichner gibt und der richtige im windows unit
          ist. aber getcaretpos und clienttoscreen haben wohl veschiedene typen von point.
          so sieht mein quellcode aus:

          {Handle des aktiven fensters holen}<br>
          handle := GetactiveWindow;<br>
          {Position des Textcursors ermitteln}<br>
          getcaretpos(all);<br>
          {Koordinaten umwandeln}<br>
          pt := windows.ClienttoScreen(handle,all);<br>

          was jetzt???

          mfg

          marku
          Herzliche Grüße

          Markus Lemcke
          barrierefreies Webdesign

          Comment


          • #6
            herr kosch,

            folgender code funktioniert innerhalb eines delphi-programmes in einem onkeydown-ereignis eines
            memofeldes, aber wenn mein lupenprogramm läuft und ich z. b. im notepad bin, klappt es nicht warum?

            var
            pt:tpoint
            handle:hwnd;

            {Position des Textcursors ermitteln}
            getcaretpos(pt);
            {Handle des aktiven fensters holen}
            handle := GetactiveWindow;
            {Koordinaten umwandeln}
            windows.ClienttoScreen(handle,pt);

            mfg

            marku
            Herzliche Grüße

            Markus Lemcke
            barrierefreies Webdesign

            Comment


            • #7
              Hallo Markus,

              GetActiveWindow gibt das Handle des aktiven Fensters der eigenen Anwendung (die GetActiveWindow aufruft) zurück. Die Frage ist: Wie bekomme ich das Handle des Fensters, das den Tastaturfokus hat auch wenn es ein "fremdes" Fenster ist?

              Gruß Lory

              Comment


              • #8
                Hallo,

                ich beantworte die letzte Frage zuerst - die Win32-API-Funktion <b>GetForegroundWindow</b> ermittelt das Fensterhandle von dem Fenster, mit dem der Anwender gerade arbeitet (d.h. das sich im Vordergrund befindet). Es gibt Sonderfälle, bei denen diese API-Funktion den Wert 0 zurückliefert

                Comment


                • #9
                  guten Tag herr kosch,

                  folgender Code bringt wieder nicht das gewünschte ergebnis:

                  {Position des Textcursors ermitteln}<br>
                  getcaretpos(pt);<br>
                  {Handle des aktiven ensters holen}<br>
                  handle := getforegroundwindow;<br>
                  {Koordinaten umwandeln}<br>
                  windows.ClienttoScreen(handle,pt);<br>

                  was ist verkehrt??????

                  mfg

                  marku
                  Herzliche Grüße

                  Markus Lemcke
                  barrierefreies Webdesign

                  Comment


                  • #10
                    herr kosch,

                    meiner meinung nach ist wahrscheinlich der aufruf getcaretpos verkehrt.
                    ich habe einen test gemacht und er bekommt immer die selben koordinaten heraus(0,38).
                    wenn Sie so freundlich wären und den code mal so schreiben würden wie sie es machen würden!!!

                    mfg

                    marku
                    Herzliche Grüße

                    Markus Lemcke
                    barrierefreies Webdesign

                    Comment


                    • #11
                      Hallo Markus,

                      nachdem ich etwas intensiver im Win32-SDK gelesen habe bin ich zu dem Schluss gekommen, das die Win32-API-Funktion <b>GetCaretPos</b> nur dann eine Wert zurückliefert, wenn die folgenden Kriterien erfüllt werden: <br>
                      1. Die eigene Anwendung ist im Vordergrund und hat auch den Tastatur-Fokus. <br>
                      2. Die eigene Anwendung hat das Caret auch erzeugt.<br>
                      3. Das Caret wurde von Win32 der eigenen Botschaftswarteschlange zugeordnet.

                      Das Win32-SDK fordert, da eine Anwendung das Caret wieder zerstören muss, wenn es den Fokus verliert bzw. wenn es inaktiv wird. Daher gehe ich nun davon aus, das der Lösungsansetz über GetCaretPos nicht brauchbar ist.

                      Wenn die Position des Carets ausgelesen werden soll, muss dieser Aufruf aus dem Adressraum des jeweils aktiven Prozesses heraus erfolgen. Und hier sind wir wieder beim Thema der globalen Hooks

                      Comment


                      • #12
                        herr kosch,

                        wenn man das handle von dem textfeld herausbekommt und man weiß ob es sich um tedit, tmemo oder trichedit handelt vielleicht geht das:

                        function getmemorow (m:tmemo):longint;<br>
                        begin<br>
                        result := sendmessage(m.handle, em_linefromchar, m.selstart,0)<br>
                        end;<br>

                        function getmemocol (m:tmemo):longint;<br>
                        begin<br>
                        result := m.selstart-sendmessage(m.handle, em_lineindex,<br> sendmessage(m.handle, em_linefromchar, m.selstart,0),0);<br>
                        end;<br>

                        habe ich aus einem buch!!!<br>

                        mfg

                        marku
                        Herzliche Grüße

                        Markus Lemcke
                        barrierefreies Webdesign

                        Comment


                        • #13
                          Hallo Markus,

                          in diesem Fall hat man aber nur den numerischen Wert für die <b>Zeile</b> (Row) und die <b>Spalte</b> (Col). Für die Position des Carets muss dann jedoch noch die Texthöhe mit ermittelt werden, um daraus eine Positionsangaben zu machen

                          Comment


                          • #14
                            also hagen reddmann meint, daß das was ich da vorhabe nicht geht, weil windows nicht erlaubt auf den
                            caret einer "fremden" anwendung zuzugreifen!!!!!!!!

                            mfg

                            marku
                            Herzliche Grüße

                            Markus Lemcke
                            barrierefreies Webdesign

                            Comment


                            • #15
                              Hallo Markus,

                              zu diesem Schluss bin ich in meiner Antwort vom 19.Dezember auch gekommen - zumindestens was das Auslesen der Caret-Position betrifft. Allerdings ist das Problem sofort beseitigt, wenn der Aufruf von GetCaretPos aus dem "fremden" Adressraum heraus erfolgt - in diesem Fall könnte ein globaler Hook dafür sorgen, das der Aufruf der fremden Anwendung untergeschoben wird.

                              Allerdings sollten globale Hooks meiner Auffassung nach extrem sparsam eingesetzt werden (wenn es überhaupt nicht anders geht)

                              Comment

                              Working...
                              X