В Notepad++ 8.5.2 команда SCI_GETSELTEXT работает, а SCI_GETCURLINE возвращает пустую строку. Вроде бы SCI_GETCURLINE никак не связана с изменениями структур.
ТекстТекущейСтроки := ТекстТекущейCтрокиNotepad(WinExist("ahk_class Notepad++")) ;получаем текст текущей строки в Notepad++. См. C:\!!Work\AutoHotkey.docx{[Текст_текущей_строки]}
MsgBox ТекстТекущейСтроки: '%ТекстТекущейСтроки%'
ТекстТекущейCтрокиNotepad(hNPP) {
;Получить текст текущей строки Notepad++
if !WinExist("ahk_id" hNPP) {
MsgBox, Окно Notepad++ не найдено
Return
}
WinGet, PID, PID
ControlGetFocus, focused
if InStr(focused, "Scintilla")
ControlGet, hScintilla, hwnd,, % focused
else
hScintilla := GetCurrentScintilla(PID)
if !hScintilla {
MsgBox, Не удалось определить текущее поле редактирования
Return
}
WinWait, ahk_id %hScintilla%
; SendMessage, SCI_GETSELTEXT := 2161 ;заменил
SendMessage, SCI_GETCURLINE := 2027
charCount := ErrorLevel
if (charCount < 2)
Return
remoteBuff := new RemoteBuffer(PID, charCount)
; SendMessage, SCI_GETSELTEXT,, remoteBuff.ptr ;заменил
SendMessage, SCI_GETCURLINE,, remoteBuff.ptr
VarSetCapacity(localBuff, charCount, 0)
remoteBuff.Read(&localBuff, charCount)
SendMessage, SCI_GETCODEPAGE := 2137
Return StrGet(&localBuff, "CP" . ErrorLevel)
}
GetCurrentScintilla(PID) {
remoteBuff := new RemoteBuffer(PID, 4)
SendMessage, NPPM_GETCURRENTSCINTILLA := 2028,, remoteBuff.ptr
VarSetCapacity(localBuff, 4, 0)
remoteBuff.Read(&localBuff, 4)
if handles := GetScintillaHandles()
Return handles[ NumGet(localBuff, "Int") + 1 ]
}
GetScintillaHandles() {
WinGet, list, ControlList
WinGet, listHwnd, ControlListHwnd
arrClassNN := StrSplit(list, "`n")
arrHwnd := StrSplit(listHwnd, "`n")
for k, v in arrClassNN {
if InStr(prevClass, "Scintilla") && InStr(v, "Scintilla")
Return [ arrHwnd[k - 1], arrHwnd[k] ]
prevClass := v
}
}
class RemoteBuffer
{
__New(PID, size) {
static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
, MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
Return
if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
Return, "", DllCall("CloseHandle", Ptr, this.hProc)
}
__Delete() {
DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
DllCall("CloseHandle", Ptr, this.hProc)
}
Read(pLocalBuff, size, offset = 0) {
if !DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось прочитать данные`nОшибка """ A_LastError """", Str, "", UInt, 0)
}
}