메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.

Autoit caret

데브카페

autoit caret

Caret 근처 텍스트 읽기

  • AutoIt에서는 현재 Caret(캐럿, 텍스트 커서) 위치의 주변 텍스트를 직접 가져오는 기본 함수가 없음
  • ControlGetText 함수와 Clipboard를 이용한 우회적인 방법으로 캐럿 왼쪽의 텍스트를 가져 와야함
  • 구현방법
  1. 캐럿이 있는 위치의 전체 텍스트를 가져옵니다.
  2. 현재 캐럿 위치를 구하고, 캐럿 왼쪽 부분의 텍스트를 추출합니다.
Func GetLeftOfCaret($hWnd, $controlID)
    ; 현재 캐럿 위치 가져오기
    Local $caretPos = _GetCaretPos()
    If @error Then
        MsgBox(16, "Error", "캐럿 위치를 가져올 수 없습니다.")
        Return ""
    EndIf

    ; 전체 텍스트 가져오기
    Local $fullText = ControlGetText($hWnd, "", $controlID)
    If $fullText = "" Then
        MsgBox(16, "Error", "텍스트를 가져올 수 없습니다.")
        Return ""
    EndIf

    ; 캐럿 위치에 해당하는 인덱스 계산 (가로 위치 사용)
    Local $caretIndex = $caretPos[0] ; 캐럿의 x 좌표가 텍스트 인덱스에 해당

    ; 캐럿 왼쪽의 텍스트 가져오기
    Local $leftText = StringLeft($fullText, $caretIndex)

    Return $leftText
EndFunc

Func _GetCaretPos()
    ; 커서 위치를 저장할 구조체 생성
    Local $struct = DllStructCreate("int;int") ; (x, y 좌표 저장)
    Local $result = DllCall("user32.dll", "int", "GetCaretPos", "ptr", DllStructGetPtr($struct))

    ; 오류 처리
    If @error Or $result[0] = 0 Then
        Return SetError(1, 0, 0) ; 오류 발생 시
    EndIf

    ; 배열 생성 및 반환
    Local $pos[2]
    $pos[0] = DllStructGetData($struct, 1) ; x 좌표
    $pos[1] = DllStructGetData($struct, 2) ; y 좌표
    Return $pos
EndFunc

; 사용 예제
Local $hWnd = WinGetHandle("[ACTIVE]") ; 현재 활성 창의 핸들
Local $controlID = "[CLASS:Edit; INSTANCE:1]" ; 대상 컨트롤 식별자 (예시)

Local $leftText = GetLeftOfCaret($hWnd, $controlID)
MsgBox(64, "캐럿 왼쪽 텍스트", $leftText)
 list_alt_GetCaretPos 함수 설명
  1. Windows API의 GetCaretPos 함수를 사용해 현재 캐럿의 위치를 구합니다.
    • 캐럿의 (x, y) 좌표를 배열로 반환합니다.
  2. GetLeftOfCaret 함수:
    • 주어진 컨트롤의 전체 텍스트를 가져옵니다.
    • 캐럿의 x 좌표에 해당하는 위치를 사용해 텍스트의 왼쪽 부분을 추출합니다.
  3. 사용 예제:
    • 현재 활성 창과 Edit 컨트롤을 대상으로 캐럿 왼쪽 텍스트를 출력합니다.
  • 주의사항
  • Edit 컨트롤에서 텍스트를 읽을 때 사용
  • 캐럿 위치와 텍스트 인덱스가 정확히 일치하지 않을 수 있으므로, 상황에 따라 조정이 필요
  • 비표준 컨트롤에서는 ControlGetText가 동작하지 않을 수 있음



Caret 숨기기

  • AutoIt에서 Caret(텍스트 커서)를 숨기는 방법은 Windows API의 HideCaret 함수 사용
  • 이 함수를 사용하면 활성화된 입력 컨트롤이나 윈도우에서 커서를 숨길 수 있음.
Func HideCaretInWindow($hWnd)
    ; Windows API를 사용해 캐럿 숨기기
    DllCall("user32.dll", "int", "HideCaret", "hwnd", $hWnd)
EndFunc

; 예제 사용: 활성 창에서 캐럿 숨기기
Local $hWnd = WinGetHandle("[ACTIVE]") ; 현재 활성 창의 핸들
HideCaretInWindow($hWnd)


Caret 다시 보이게 하기

  • 캐럿을 다시 보이게 하려면 ShowCaret API를 사용.
Func ShowCaretInWindow($hWnd)
    ; Windows API를 사용해 캐럿 다시 보이게 하기
    DllCall("user32.dll", "int", "ShowCaret", "hwnd", $hWnd)
EndFunc

; 예제 사용: 활성 창에서 캐럿 다시 보이게 하기
Local $hWnd = WinGetHandle("[ACTIVE]")
ShowCaretInWindow($hWnd)

{{틀:요약 |제목=사용 시 주의사항

  1. HideCaret 과 ShowCaret 은 입력 가능한 컨트롤(예: Edit 컨트롤)이 있는 창에서만 동작 함.
  2. HideCaret을 호출했을 때 캐럿이 숨겨지지 않는다면 해당 창이나 컨트롤에 포커스가 맞춰져 있는지 확인
  3. 숨긴 후 다시 보이게 하고 싶을 때는 ShowCaret() 호출해야 함.
  • 참고

다른방법 참고 사이트

Comments