Position der Einfügemarke

  • Guten Abend,

    ich suche die Position der Einfügemarke unter Windows 8 / 64 bezogen auf (a) das aktive Fenster (b) auf den Bildschirm.

    Mit welcher Funktion / API kann ich die Position der Einfügemarke ermitteln?

    Ich möchte die Position speichern und wiederherstellen.

    Effektiv suche ich in Analogie sowas wie

    MouseGetPos - Ermittelt die aktuelle Position des Mauscursors.

    ... für den Textcursor / die Einfügemarke.

    vielen Dank

    :)

  • Diese beiden Befehle dürften deine Wünsche perfekt erfüllen.

    WinGetCaretPos()

    #include <WinAPIRes.au3>
    _WinAPI_GetCaretPos ( )

    Hoffe das passt für dich.

  • Vielen Dank Tuxedo.

    Ich habe das heute probiert - bei Notepad z.B. erhalte ich Fehler 10.

    Auch bei anderen zuvor mit WinActivate aktivierten Fenstern - kein Erfolg.

    #include <Array.au3>

    #include <WinAPIRes.au3>

    $aTextCursorPosition = _WinAPI_GetCaretPos ( )

    ConsoleWrite (@ScriptLineNumber & @TAB & "@error = " & @error & @CRLF)

    _ArrayDisplay ( $aTextCursorPosition )

    Array wird nicht angezeigt.

    Auch mit WinGetCaretPos() hatte ich keinen Erfolg.

    Zu müde für heute - ich versuche es die nächsten Tage nochmal, wenn ich wieder AutoIt-Themen beackern kann :)

    Danke :)

  • Schau dir mal die Funktion _WinAPI_CreateCaret an... wird das Fenster inaktiv, wird das (rote) Caret ausgeblendet.

    AutoIt
    #include <Array.au3>
    #include <WinAPIRes.au3>
    #include <WinAPIError.au3>
    
    $aTextCursorPosition = _WinAPI_GetCaretPos() ; Error 10
    If @error Then
        Exit ConsoleWrite(StringFormat('! %-27s = %i\n! %-27s = %i\n! %-27s = %s\n', '@error', @error, '_WinAPI_GetLastError', _WinAPI_GetLastError(), '_WinAPI_GetLastErrorMessage', _WinAPI_GetLastErrorMessage()))
    EndIf
    _ArrayDisplay($aTextCursorPosition)
  • Entschuldige AutoMit , das hätte ich eigentlich noch wissen können, habs aber wohl vergesssen.

    Ich hatte mal damit expermimentiert einen Markierungsbereich auf dem Desktop abhängig vom

    Textcursor zu verschieben, das hat damals nicht funktioniert.

    Der Grund war, daß die Position ständig 15 bis 20 Zeichen oder mehr daneben lag, es hat nie richtig funktioniert und ich habs dann einfach

    ohne Autoit auf andere Weise gelöst. Aber eine Fehlermeldung gabs bei mir niemals, war aber auch noch Version 3.3.8.1,

    Dafür steht das mit den falschen Positionen jetzt sogar in der Hilfe.

  • Danke Tuxedo, ich habe das in der Hilfe gelesen. Ich schaffe es leider gar nicht, Positionswerte zu erhalten.


    Danke Bitnugger, _WinAPI_CreateCaret schaue ich mir an - zuerst das, was nach mehreren Versuchen in unterschiedlichen Fenstern bei Deinem Code herausgekommen ist

    ConsoleWrite(StringFormat('! %-27s = %i\n! %-27s = %i\n! %-27s = %s\n', '@error', @error, '_WinAPI_GetLastError', _WinAPI_GetLastError(), '_WinAPI_Get

    Vielen Dank für Deine Zeilen. Ich habe den Code bei Notepad ausprobiert und erhielt folgende Fehlermeldung:

    ! @error = 10

    ! _WinAPI_GetLastError = 998

    ! _WinAPI_GetLastErrorMessage = Unzulässiger Zugriff auf einen Speicherbereich.


    Eine härtere Nuss, als ich dachte. Der Textcursor ist fast ständig zu sehen und nicht zu erwischen :)

    Gibt es noch eine alternative Möglichkeit seine Position zu ermitteln?

    Windows muss doch ständig wissen, wo er sich befindet, sonst könnte der Text nicht an der richtigen Stelle eingegeben werden.

    • Offizieller Beitrag

    _WinApi_GetCaretPos scheint falsch implementiert zu sein, liefert immer einen Fehler.

    Zur Positionsbestimmung des Cursors aber auch völlig unnötig:

    AutoIt
    ShellExecute('notepad')
    Local $hWndNotepad = WinWait('[CLASS:Notepad]', '', 5)
    Local $aCaret = WinGetCaretPos()
    Local $xCaret = $aCaret[0]
    Local $yCaret = $aCaret[1]
    
    ; zum Vergleich Maus auf Cursorpos bewegen
    MouseMove($xCaret, $yCaret, 30)
  • _WinApi_GetCaretPos scheint falsch implementiert zu sein, liefert immer einen Fehler.

    Schau dir mal die Funktion _WinAPI_CreateCaret an...

    WinGetCaretPos liefert zumindest bei mir auf Win 10 X64 nicht die korrekte y-Pos.

    So stimmt die Position:

    Edit: Zeile hinzugefügt: $aCaret[0] += $aPos[0]

    Einmal editiert, zuletzt von Bitnugger (27. April 2018 um 23:34)

  • Ich danke Euch 3 für die tolle Hilfe.

    Das Beispiel von BugFix lief hier auf Anhieb. Bei den anderen beiden muss ich mich noch einarbeiten.

    Problem doch nicht gelöst - dennoch ein wunderbares Wochenende :)

    Zu früh gefreut - mit Notepad funktioniert es.

    Code
    Sleep (5000)                                                ;     Pause - um in ein x beliebiges Fenster zu klicken und die Maus zu verschieben
    Local $aCaret = WinGetCaretPos()
    Local $xCaret = $aCaret[0]
    Local $yCaret = $aCaret[1]
    ; zum Vergleich Maus auf Cursorpos bewegen
    MouseMove($xCaret, $yCaret, 30)

    Schon bei bekannten Programmen wie dem Total Commander 9.x - TextCursor in der cmd-Zeile vom Total Commander - findet das Script den Cursor nicht.

    Auch andere ( weniger bekannte ) Programme habe ich getestet, und gleiches Ergebnis - der Textcursor wird nicht gefunden.

    Auch im FireFox - Cursor im Text hier im Forum :) - findet das Script den TextCursor nicht.

    Gleiches gilt für die URL-Zeile von Chrome und FireFox.


    Wer mag und den Total Commander hat, probiere es bitte, ob der TextCursor in der cmd-Zeile gefunden wird.

    Dei URL-Zeile von Chrome und FireFox bieten sich ebenfalls für einen Test an.

    Ich probiere die anderen Scripte eingehender aus - auf Anhieb funktionierte keines beim Total Commander.

    5 Mal editiert, zuletzt von AutoMit (27. April 2018 um 21:54)

  • Gibt es einen Grund warum du den Textmarker Position in der CMD erfassen willst? Was hast du denn überhaupt vor, bzw. was willst du erreichen. Für mich liest sich das so, als ob dein Lösungsweg zu deinem eigentlichen Problem komplett unpassend ist.

  • Schon bei bekannten Programmen wie dem Total Commander 9.x - TextCursor in der cmd-Zeile vom Total Commander - findet das Script den Cursor nicht.

    Doch...

    Dei URL-Zeile von Chrome und FireFox bieten sich ebenfalls für einen Test an.

    Wenn du mit Au3Info keine Infos zu dem Control bekommst, dann funktioniert WinGetCaretPos auch nicht, weil es dann wohl keine Standard-Controls (Input/Edit) sind.

    Einmal editiert, zuletzt von Bitnugger (27. April 2018 um 23:48)

  • Wenn du mit Au3Info keine Infos zu dem Control bekommst, dann funktioniert WinGetCaretPos auch nicht, weil es dann wohl keine Standard-Controls (Input/Edit) sind.

    Vielen Dank Bitnugger für Dein Script auf Basis von WinGetCaretPos.

    Test-Taste F5 - eine gute Idee, so konnte ich viele Fenster unkompliziert testen.

    Hast Du eine Idee, wie man die Einfügemarke in der URL-Zeile von Chrome / FireFox findet?

    Die Windows API Funktion habe ich dafür nicht zum Laufen gebracht.

    Was hast du denn überhaupt vor, bzw. was willst du erreichen.

    Es wurde gefragt, was der Hintergrund ist. Es gibt viele Anwendungszwecke, für die ich das nutzen möchte - einen hier stellvertretend:

    Bei einer Textverarbeitung ist im Suchfeld eine DropDownListe integriert, für die die Au3Info keine Information liefert ( für das Suchfeld auch nicht).

    Wenn sich die Einfügemarke in dem Suchfeld befindet, dann sollen automatisch die DropDownListe geöffnet werden und z.B. die Option "Alle" ausgewählt werden..

    [Blockierte Grafik: https://i.imgur.com/w8yunPk.jpg]

    Zum besseren Verständnis ein Bild :)

    Gibt es eine bessere Möglichkeit, als das über die Position der Einführungsmarke zu realisieren?

    PS:

    Gibt es in den API Untiefen noch eine andere Möglichkeit, die Einfügemarke abzufragen, wenn es kein Standardkontrol ist?

    Hoffentlich :)

  • Hast Du eine Idee, wie man die Einfügemarke in der URL-Zeile von Chrome / FireFox findet?

    https://developer.mozilla.org/en-US/docs/Web/API/CaretPosition

    Bei einer Textverarbeitung ist im Suchfeld eine DropDownListe integriert, für die die Au3Info keine Information liefert ( für das Suchfeld auch nicht).

    Hört sich an, als wenn du von einer ComboBox redest. Wenn du mit Au3Info keine Infos zu dem Control bekommst, dann ist es wohl auch keine Standard-Control, oder aber, die "ComboBox" befindet sich innerhalb eines Group-Controls... in dem Fall liefert Au3Info leider nur Infos zu diesem. Da wir aber nicht wissen, welche Textverarbeitung es ist, können wir nicht mehr dazu sagen.

    Wenn sich die Einfügemarke in dem Suchfeld befindet, dann sollen automatisch die DropDownListe geöffnet werden und z.B. die Option "Alle" ausgewählt werden..

    Gibt es eine bessere Möglichkeit, als das über die Position der Einführungsmarke zu realisieren?

    Wenn es entscheidend ist, wo genau die Einfügemarke steht, dann nicht... aber das scheint nicht der Fall zu sein. In dem Fall würde es reichen danach zufragen, welches Control den Fokus hat.

    ControlGetFocus ( "title" [, "text"] )

    Bei einer ComboBox ginge das etwa so:

    _GUICtrlComboBox_SetCurSel ( $hWnd [, $iIndex = -1] )

    _GUICtrlComboBox_ShowDropDown ( $hWnd [, $bShow = False] )

    2 Mal editiert, zuletzt von Bitnugger (2. Mai 2018 um 16:34)