<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Carlet_%EC%9D%BD%EA%B8%B0_-winapi_%EC%9D%B4%EC%9A%A9</id>
	<title>Carlet 읽기 -winapi 이용 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://devcafe.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=Carlet_%EC%9D%BD%EA%B8%B0_-winapi_%EC%9D%B4%EC%9A%A9"/>
	<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=Carlet_%EC%9D%BD%EA%B8%B0_-winapi_%EC%9D%B4%EC%9A%A9&amp;action=history"/>
	<updated>2026-08-17T00:18:08Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://devcafe.co.kr/w/index.php?title=Carlet_%EC%9D%BD%EA%B8%B0_-winapi_%EC%9D%B4%EC%9A%A9&amp;diff=2493&amp;oldid=prev</id>
		<title>Devcafe: 새 문서: == Carlet 읽기 -winapi 이용  == &lt;source lang=autoit&gt; #include &lt;WinAPI.au3&gt; #include &lt;SendMessage.au3&gt; #include &lt;GuiEdit.au3&gt;  ; ====== 메시지 상수 정의 ====== ;~ Global Const $EM_GETSEL       = 0x00B0 ;~ Global Const $EM_LINEFROMCHAR = 0x00C9 ;~ Global Const $EM_LINEINDEX    = 0x00BB ;~ Global Const $EM_LINELENGTH   = 0x00C1  ; ====== 핫키 등록 (Ctrl+Shift+R : 캐럿 텍스트 읽기) ====== HotKeySet(&quot;^+r&quot;, &quot;ReadCaretText&quot;) ConsoleWrite(&quot;아무 편집창에서나...</title>
		<link rel="alternate" type="text/html" href="https://devcafe.co.kr/w/index.php?title=Carlet_%EC%9D%BD%EA%B8%B0_-winapi_%EC%9D%B4%EC%9A%A9&amp;diff=2493&amp;oldid=prev"/>
		<updated>2026-07-22T16:26:00Z</updated>

		<summary type="html">&lt;p&gt;새 문서: == Carlet 읽기 -winapi 이용  == &amp;lt;source lang=autoit&amp;gt; #include &amp;lt;WinAPI.au3&amp;gt; #include &amp;lt;SendMessage.au3&amp;gt; #include &amp;lt;GuiEdit.au3&amp;gt;  ; ====== 메시지 상수 정의 ====== ;~ Global Const $EM_GETSEL       = 0x00B0 ;~ Global Const $EM_LINEFROMCHAR = 0x00C9 ;~ Global Const $EM_LINEINDEX    = 0x00BB ;~ Global Const $EM_LINELENGTH   = 0x00C1  ; ====== 핫키 등록 (Ctrl+Shift+R : 캐럿 텍스트 읽기) ====== HotKeySet(&amp;quot;^+r&amp;quot;, &amp;quot;ReadCaretText&amp;quot;) ConsoleWrite(&amp;quot;아무 편집창에서나...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Carlet 읽기 -winapi 이용  ==&lt;br /&gt;
&amp;lt;source lang=autoit&amp;gt;&lt;br /&gt;
#include &amp;lt;WinAPI.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;SendMessage.au3&amp;gt;&lt;br /&gt;
#include &amp;lt;GuiEdit.au3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; ====== 메시지 상수 정의 ======&lt;br /&gt;
;~ Global Const $EM_GETSEL       = 0x00B0&lt;br /&gt;
;~ Global Const $EM_LINEFROMCHAR = 0x00C9&lt;br /&gt;
;~ Global Const $EM_LINEINDEX    = 0x00BB&lt;br /&gt;
;~ Global Const $EM_LINELENGTH   = 0x00C1&lt;br /&gt;
&lt;br /&gt;
; ====== 핫키 등록 (Ctrl+Shift+R : 캐럿 텍스트 읽기) ======&lt;br /&gt;
HotKeySet(&amp;quot;^+r&amp;quot;, &amp;quot;ReadCaretText&amp;quot;)&lt;br /&gt;
ConsoleWrite(&amp;quot;아무 편집창에서나 커서를 원하는 위치에 두신 후 Ctrl+Shift+R을 눌러주세요.&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
ConsoleWrite(&amp;quot;종료하려면 Ctrl+Shift+X를 누르세요.&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
HotKeySet(&amp;quot;^+x&amp;quot;, &amp;quot;_Exit&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
While 1&lt;br /&gt;
    Sleep(100)&lt;br /&gt;
WEnd&lt;br /&gt;
&lt;br /&gt;
Func _Exit()&lt;br /&gt;
    Exit&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ====== 캐럿 위치 텍스트 읽기 메인 함수 ======&lt;br /&gt;
Func ReadCaretText()&lt;br /&gt;
    ; 1. 현재 활성(최상위) 윈도우 핸들&lt;br /&gt;
    Local $hWin = WinGetHandle(&amp;quot;[ACTIVE]&amp;quot;)&lt;br /&gt;
    If @error Or $hWin = 0 Then&lt;br /&gt;
        MsgBox(16, &amp;quot;오류&amp;quot;, &amp;quot;활성 윈도우를 찾을 수 없습니다.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
&lt;br /&gt;
    ; 2. 캐럿(키보드 포커스)이 위치한 실제 컨트롤 핸들 구하기 (다른 프로세스도 지원)&lt;br /&gt;
    Local $hEdit = _GetFocusedControlHandle()&lt;br /&gt;
    If $hEdit = 0 Then&lt;br /&gt;
        MsgBox(16, &amp;quot;오류&amp;quot;, &amp;quot;포커스된 컨트롤을 찾을 수 없습니다.&amp;quot;)&lt;br /&gt;
        Return&lt;br /&gt;
    EndIf&lt;br /&gt;
&lt;br /&gt;
    ; 3. 현재 캐럿(커서) 위치 가져오기 - EM_GETSEL&lt;br /&gt;
    Local $iResult = _SendMessage($hEdit, $EM_GETSEL, 0, 0, 0, &amp;quot;int&amp;quot;, &amp;quot;int&amp;quot;, &amp;quot;int&amp;quot;)&lt;br /&gt;
    Local $iCaretPos = BitAND($iResult, 0xFFFF)  ; LOWORD 추출 = 캐럿 위치&lt;br /&gt;
&lt;br /&gt;
    ; 4. 캐럿이 위치한 줄 번호 확인&lt;br /&gt;
    Local $iLineIndex = _SendMessage($hEdit, $EM_LINEFROMCHAR, $iCaretPos, 0)&lt;br /&gt;
&lt;br /&gt;
    ; 5. 해당 줄의 시작 문자 위치(offset) 확인&lt;br /&gt;
    Local $iLineStart = _SendMessage($hEdit, $EM_LINEINDEX, $iLineIndex, 0)&lt;br /&gt;
&lt;br /&gt;
    ; 6. 해당 줄의 길이 확인&lt;br /&gt;
    Local $iLineLength = _SendMessage($hEdit, $EM_LINELENGTH, $iLineStart, 0)&lt;br /&gt;
&lt;br /&gt;
    ; 7. 전체 텍스트를 가져와서 해당 줄만 추출&lt;br /&gt;
    Local $sFullText = ControlGetText($hWin, &amp;quot;&amp;quot;, $hEdit)&lt;br /&gt;
    Local $sLineText = StringMid($sFullText, $iLineStart + 1, $iLineLength)&lt;br /&gt;
&lt;br /&gt;
    ; 8. 현재 단어도 함께 추출&lt;br /&gt;
    Local $sWord = GetWordAtPosition($sFullText, $iCaretPos)&lt;br /&gt;
&lt;br /&gt;
    ; 결과 출력&lt;br /&gt;
    ConsoleWrite(&amp;quot;=== 캐럿 위치 정보 ===&amp;quot; &amp;amp; @CRLF)&lt;br /&gt;
    ConsoleWrite(&amp;quot;윈도우 핸들: &amp;quot; &amp;amp; $hWin &amp;amp; @CRLF)&lt;br /&gt;
    ConsoleWrite(&amp;quot;컨트롤 핸들: &amp;quot; &amp;amp; $hEdit &amp;amp; @CRLF)&lt;br /&gt;
    ConsoleWrite(&amp;quot;줄 번호: &amp;quot; &amp;amp; ($iLineIndex + 1) &amp;amp; @CRLF)&lt;br /&gt;
    ConsoleWrite(&amp;quot;캐럿 위치(전체 기준): &amp;quot; &amp;amp; $iCaretPos &amp;amp; @CRLF)&lt;br /&gt;
    ConsoleWrite(&amp;quot;현재 줄 텍스트: &amp;quot; &amp;amp; $sLineText &amp;amp; @CRLF)&lt;br /&gt;
    ConsoleWrite(&amp;quot;현재 단어: &amp;quot; &amp;amp; $sWord &amp;amp; @CRLF)&lt;br /&gt;
    ConsoleWrite(&amp;quot;=====================&amp;quot; &amp;amp; @CRLF &amp;amp; @CRLF)&lt;br /&gt;
&lt;br /&gt;
    ; 툴팁으로도 표시&lt;br /&gt;
    ToolTip(&amp;quot;줄: &amp;quot; &amp;amp; $sLineText &amp;amp; @CRLF &amp;amp; &amp;quot;단어: &amp;quot; &amp;amp; $sWord, MouseGetPos(0), MouseGetPos(1) - 60)&lt;br /&gt;
    Sleep(2000)&lt;br /&gt;
    ToolTip(&amp;quot;&amp;quot;)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ====== 캐럿(키보드 포커스)이 위치한 실제 컨트롤 핸들 구하기 ======&lt;br /&gt;
; GetGUIThreadInfo API는 다른 프로세스의 스레드 정보도 가져올 수 있어서&lt;br /&gt;
; 활성 프로그램이 메모장이 아니어도 동작합니다.&lt;br /&gt;
Func _GetFocusedControlHandle()&lt;br /&gt;
    Local $hActive = _WinAPI_GetForegroundWindow()&lt;br /&gt;
    If @error Or $hActive = 0 Then Return 0&lt;br /&gt;
&lt;br /&gt;
    Local $aCall = DllCall(&amp;quot;user32.dll&amp;quot;, &amp;quot;dword&amp;quot;, &amp;quot;GetWindowThreadProcessId&amp;quot;, &amp;quot;hwnd&amp;quot;, $hActive, &amp;quot;ptr&amp;quot;, 0)&lt;br /&gt;
    If @error Then Return 0&lt;br /&gt;
    Local $iThreadId = $aCall[0]&lt;br /&gt;
&lt;br /&gt;
    Local $tGUI = DllStructCreate( _&lt;br /&gt;
            &amp;quot;dword cbSize;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;dword flags;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;hwnd hwndActive;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;hwnd hwndFocus;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;hwnd hwndCapture;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;hwnd hwndMenuOwner;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;hwnd hwndMoveSize;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;hwnd hwndCaret;&amp;quot; &amp;amp; _&lt;br /&gt;
            &amp;quot;long left;long top;long right;long bottom&amp;quot;)&lt;br /&gt;
    DllStructSetData($tGUI, &amp;quot;cbSize&amp;quot;, DllStructGetSize($tGUI))&lt;br /&gt;
&lt;br /&gt;
    Local $aResult = DllCall(&amp;quot;user32.dll&amp;quot;, &amp;quot;bool&amp;quot;, &amp;quot;GetGUIThreadInfo&amp;quot;, _&lt;br /&gt;
            &amp;quot;dword&amp;quot;, $iThreadId, &amp;quot;ptr&amp;quot;, DllStructGetPtr($tGUI))&lt;br /&gt;
    If @error Or Not $aResult[0] Then Return 0&lt;br /&gt;
&lt;br /&gt;
    Local $hFocus = DllStructGetData($tGUI, &amp;quot;hwndFocus&amp;quot;)&lt;br /&gt;
    If $hFocus = 0 Then $hFocus = $hActive ; 포커스 정보가 없으면 활성 윈도우 자체를 사용&lt;br /&gt;
&lt;br /&gt;
    Return $hFocus&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
; ====== 특정 위치의 단어 추출 함수 ======&lt;br /&gt;
Func GetWordAtPosition($sText, $iPos)&lt;br /&gt;
    Local $iStart = $iPos&lt;br /&gt;
    Local $iEnd = $iPos&lt;br /&gt;
    While $iStart &amp;gt; 0&lt;br /&gt;
        Local $sChar = StringMid($sText, $iStart, 1)&lt;br /&gt;
        If $sChar = &amp;quot; &amp;quot; Or $sChar = @CR Or $sChar = @LF Or $sChar = @TAB Then&lt;br /&gt;
            ExitLoop&lt;br /&gt;
        EndIf&lt;br /&gt;
        $iStart -= 1&lt;br /&gt;
    WEnd&lt;br /&gt;
    While $iEnd &amp;lt; StringLen($sText)&lt;br /&gt;
        Local $sChar = StringMid($sText, $iEnd + 1, 1)&lt;br /&gt;
        If $sChar = &amp;quot; &amp;quot; Or $sChar = @CR Or $sChar = @LF Or $sChar = @TAB Then&lt;br /&gt;
            ExitLoop&lt;br /&gt;
        EndIf&lt;br /&gt;
        $iEnd += 1&lt;br /&gt;
    WEnd&lt;br /&gt;
    Return StringMid($sText, $iStart + 1, $iEnd - $iStart)&lt;br /&gt;
EndFunc&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Devcafe</name></author>
	</entry>
</feed>