1 (изменено: Vadus, 2022-09-08 09:10:27)

Тема: AHK: Поиск в Notepad++ с помощью Scintilla

Добрый всем!
Пытаюсь запрограммировать поиск из AHK в тексте Notepad++ с помощью Scintilla-команды SCI_SEARCHINTARGET.
За образец взял https://www.autohotkey.com/boards/viewt … =Scintilla. Там подсказали, как вставлять текст с помощью Scintilla-команды SCI_REPLACESEL, и это работает нормально.

Вот такой код для поиска получился:

   
SCI_SETSEARCHFLAGS := 2198
SCFIND_REGEXP := 0x00200000
SCI_SETTARGETSTART := 2190
SCI_SETTARGETEND := 2192
SCI_SEARCHINTARGET := 2197
SCI_GETTARGETSTART := 2191
SCI_GETTARGETEND := 2193   
SCI_GETSEARCHFLAGS := 2199

ControlGet, hScintilla, hwnd,, Scintilla1, ahk_class Notepad++
if !hScintilla {
   MsgBox, Scintilla not found
   ExitApp
}

;--- Устанавливаем флаги поиска SCI_SETSEARCHFLAGS
SendMessage, SCI_SETSEARCHFLAGS, SCFIND_REGEXP,,, ahk_id %hScintilla% ;опция поиска, когда строку поиска следует интерпретировать как регулярное выражение

	;--- Устанавливаем целевой диапазон поиска — от начала текста до 1000-й позиции
SendMessage, SCI_SETTARGETSTART, 0,,, ahk_id %hScintilla%
	SendMessage, SCI_SETTARGETEND, 1000,,, ahk_id %hScintilla%

;--- Производим поиск с помощью регулярных выражений. В данном случае ищем простой текст "text"
firstMatchPos := SCI_SEARCHINTARGET(hScintilla, "text")
MsgBox firstMatchPos: '%firstMatchPos%' ;выводит 0

;--- Получаем позиции найденной фразы, помещенные в TARGET
SendMessage, SCI_GETTARGETSTART,,,, ahk_id %hScintilla%
foundStart := ErrorLevel
MsgBox foundStart: '%foundStart%' ;выводит 0

SendMessage, SCI_SETTARGETEND,,,, ahk_id %hScintilla%
foundEnd := ErrorLevel
MsgBox foundEnd: '%foundEnd%' ;выводит 0


SCI_SEARCHINTARGET(hScintilla, text) 
; Функция поиска по регулярному выражению в Notepad++. Возвращает позицию начала найденного текста или -1, если не нашли
{
	WinGet, PID, PID, ahk_id %hScintilla%
	size := StrPut(text, "UTF-8")
	; size := StrPut(text, "CP1251")
	RB := new RemoteBuffer(PID, size) ;создаем новый RemoteBuffer
	VarSetCapacity(buf, size, 0)
	StrPut(text, &buf, "UTF-8")
	; StrPut(text, &buf, "CP1251")
	RB.Write(&buf, size)
	
	firstMatchPos := -1
	SendMessage, SCI_SEARCHINTARGET, 2, RB.ptr,, ahk_id %hScintilla% 	; Производим поиск с помощью регулярных выражений
	firstMatchPos := ErrorLevel
	Return %firstMatchPos% ; должен возвращать позицию начала найденного текста или -1, если не нашли
}


class RemoteBuffer
{
   __New(PID, size) {
      static flags := (PROCESS_VM_OPERATION := 0x8) | (PROCESS_VM_WRITE := 0x20) | (PROCESS_VM_READ := 0x10)
           , Params := ["UInt", MEM_COMMIT := 0x1000, "UInt", PAGE_READWRITE := 0x4, "Ptr"]
         
      if !this.hProc := DllCall("OpenProcess", "UInt", flags, "Int", 0, "UInt", PID, "Ptr")
         throw Exception("Can't open remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      
      if !this.ptr := DllCall("VirtualAllocEx", "Ptr", this.hProc, "Ptr", 0, "Ptr", size, Params*) {
         DllCall("CloseHandle", "Ptr", this.hProc)
         throw Exception("Can't allocate memory in remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      }
   }
   __Delete() {
      DllCall("VirtualFreeEx", "Ptr", this.hProc, "Ptr", this.ptr, "UInt", 0, "UInt", MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", "Ptr", this.hProc)
   }  
   Read(ByRef localBuff, size, offset = 0) {
      VarSetCapacity(localBuff, size, 0)
      if !DllCall("ReadProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", &localBuff, "Ptr", size, "PtrP", bytesRead)
         throw Exception("Can't read data from remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Read")
      Return bytesRead
   }
   Write(pData, size, offset = 0) {
      if !res := DllCall("WriteProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", pData, "Ptr", size, "PtrP", bytesWritten)
         throw Exception("Can't write data to remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Write")
      Return bytesWritten
   }
}


Но он всегда возвращает нули:
firstMatchPos=0, а должен возвращать позицию начала найденного текста или -1, если не нашли.
foundStart=0, а должен возвращать позицию начала найденного текста, то есть ту же, что firstMatchPos.
foundEnd=0, а должен возвращать позицию конца найденного текста.

В чем может быть проблема, подскажите плиз. Может быть есть другой путь автоматизировать поиск в Notepad++?

На всякий случай: сам поиск я пытался строить, используя код на C++ для плагина Notepad++, который работает:


    // Получаем текущий экземпляр scintilla. Get the current scintilla
    int which = -1;
    ::SendMessage(nppData._nppHandle, NPPM_GETCURRENTSCINTILLA, 0, (LPARAM)&which);
    if (which == -1)
        return;
    HWND curScintilla = (which == 0)?nppData._scintillaMainHandle:nppData._scintillaSecondHandle;

//- Задаем опции поиска
::SendMessage(curScintilla, SCI_SETSEARCHFLAGS, SCFIND_REGEXP, 0); //опция поиска, когда строку поиска следует интерпретировать как регулярное выражение
LRESULT currentPosition = ::SendMessage(curScintilla, SCI_GETCURRENTPOS, 0, 0); // получает номер текущей позиции курсора во всем тексте

//--- Устанавливаем целевой диапазон поиска — от текущей позиции к началу текста — ищем назад по тексту
::SendMessage(curScintilla, SCI_SETTARGETSTART, 0, 0); //задаём область поиска от начала текста
::SendMessage(curScintilla, SCI_SETTARGETEND, 1000, 0); //задаём область поиска до 1000-й позиции 

string RegString = "Probe"; //текст (шаблон) для поиска
LRESULT firstMatchPos = -1; //создаем и задаем начальное значение переменной, в которой будет храниться найденное вхождение при поиске
firstMatchPos = ::SendMessage(curScintilla, SCI_SEARCHINTARGET, 2, (LPARAM)RegString.c_str()); // Ищем текст
//=== Если нашли, получаем найденный текст и установливаем на нем курсор
if (firstMatchPos == -1) //если не нашли — выходим
	return;
//--- После поиска получаем диапазон (начало и конец) найденной фразы
LRESULT foundStart;
foundStart = ::SendMessage(curScintilla, SCI_GETTARGETSTART, 0, 0); //получаем позицию начала найденной фразы, помещенное в TARGET

LRESULT foundEnd;
foundEnd = ::SendMessage(curScintilla, SCI_GETTARGETEND, 0, 0); //получаем позицию конца найденной фразы, помещенное в TARGET
LPSTR НайденныйТекст = (LPSTR)new char[foundEnd - foundStart]; //задаем текстовую переменную, в которую затем поместим текст диапазона
Sci_TextRange tr; //создаем объект TextRange — текстовый диапазон
tr.chrg.cpMin = (int)foundStart; //задаем начало диапазона — начало найденной фразы
tr.chrg.cpMax = (int)foundEnd; //задаем конец диапазона — конец найденной фразы
//Задаем начальный текст диапазона, пока пустую переменную
tr.lpstrText = НайденныйТекст;

::SendMessage(curScintilla, SCI_GETTEXTRANGE, 0, reinterpret_cast<LPARAM>(&tr)); //получаем текст диапазона TARGET (найденную фразу) и помещаем его в переменную tr
MessageBoxA(NULL, tr.lpstrText, "Текст диапазона tr.lpstrText", MB_OK); //Выводит сообщение — текст диапазона — найденную фразу

//Прокрутить экран до найденной фразы и установить на нее курсор
SendMessage(curScintilla, SCI_GOTOPOS, foundStart, NULL);

//--- Установить начало и конец выделения 
::SendMessage(curScintilla, SCI_SETSELECTIONSTART, foundStart, NULL); //задаём начало выделения — номер позиции курсора во всем тексте
::SendMessage(curScintilla, SCI_SETSELECTIONEND, foundEnd, NULL); //задаём конец выделения — номер позиции курсора во всем тексте

2

Re: AHK: Поиск в Notepad++ с помощью Scintilla

Не тестировал, но в функции SCI_SEARCHINTARGET не определено, и после Return знаки процента не нужны.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3 (изменено: Vadus, 2022-09-08 09:10:49)

Re: AHK: Поиск в Notepad++ с помощью Scintilla

Спасибо, проверю.

4

Re: AHK: Поиск в Notepad++ с помощью Scintilla

Только точку верните.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Поиск в Notepad++ с помощью Scintilla

Спасибо, teadrinker! Исправил, теперь работает. Находит и выделяет фразу, в том числе кириллицу. Прокручивает экран до нее:

SCI_SETSEL          := 2160
SCI_SETSEARCHFLAGS  := 2198
SCFIND_REGEXP 		:= 0x00200000
SCI_SETTARGETSTART 	:= 2190
SCI_SETTARGETEND 	:= 2192
SCI_SEARCHINTARGET 	:= 2197
SCI_GETTARGETSTART 	:= 2191
SCI_GETTARGETEND 	:= 2193   
SCI_GETSEARCHFLAGS 	:= 2199

ControlGet, hScintilla, hwnd,, Scintilla1, ahk_class Notepad++
if !hScintilla {
   MsgBox, Scintilla not found
   ExitApp
}

;--- Устанавливаем флаги поиска SCI_SETSEARCHFLAGS
SendMessage, SCI_SETSEARCHFLAGS, SCFIND_REGEXP,,, ahk_id %hScintilla% ;опция поиска, когда строку поиска следует интерпретировать как регулярное выражение}

;Получаем длину всего текста в редакторе
SendMessage, SCI_GETTEXTLENGTH := 2183, 0,,, ahk_id %hScintilla%
ДлинаТекста := ErrorLevel
; MsgBox ДлинаТекста: '%ДлинаТекста%'

;Получаем номер текущей позиции курсора во всем тексте
SendMessage, SCI_GETCURRENTPOS := 2008, 0,,, ahk_id %hScintilla%
currentPosition := ErrorLevel
; MsgBox currentPosition: %currentPosition%

;--- Устанавливаем целевой диапазон поиска — от начала до конца текста
SendMessage, SCI_SETTARGETSTART, 0,,, ahk_id %hScintilla%
SendMessage, SCI_SETTARGETEND, ДлинаТекста,,, ahk_id %hScintilla%


;--- Производим поиск с помощью регулярных выражений
firstMatchPos := Func_SEARCHINTARGET(hScintilla, "русск.+?поиска") ;ищем русский текст
;в firstMatchPos — позиция начала найденного текста или -1, если не нашли
; MsgBox firstMatchPos: '%firstMatchPos%'  

;--- Получаем позиции найденной фразы, помещенные в TARGET
 SendMessage, SCI_GETTARGETSTART,,,, ahk_id %hScintilla%
 foundStart := ErrorLevel
 ; MsgBox foundStart: '%foundStart%' ;выводит 0

 SendMessage, SCI_GETTARGETEND,,,, ahk_id %hScintilla%
 foundEnd := ErrorLevel
 ; MsgBox foundEnd: '%foundEnd%' ;выводит 0

; Прокрутить экран до найденной фразы и установить на нее курсор
SendMessage, SCI_SETSEL, foundStart, foundEnd,, ahk_id %hScintilla%

Func_SEARCHINTARGET(hScintilla, text) 
;Функция поиска в Notepad++ с помощью регулярного выражения
{
	SCI_SEARCHINTARGET := 2197
	firstMatchPos := -1
	WinGet, PID, PID, ahk_id %hScintilla%
	; size := StrPut(text, "UTF-8") ;чтобы работал поиск кириллицы в файле с кодировкой UTF-8
	size := StrPut(text, "CP1251") ;чтобы работал поиск кириллицы в файле с ANSI-кодировкой
	RB := new RemoteBuffer(PID, size) ;создаем новый RemoteBuffer
	VarSetCapacity(buf, size, 0)
	; StrPut(text, &buf, "UTF-8");чтобы работал поиск кириллицы в файле с кодировкой UTF-8
	StrPut(text, &buf, "CP1251") ;чтобы работал поиск кириллицы в файле с ANSI-кодировкой
	RB.Write(&buf, size)
	SendMessage, SCI_SEARCHINTARGET, 10, RB.ptr,, ahk_id %hScintilla%
	firstMatchPos := ErrorLevel
	Return firstMatchPos
}


class RemoteBuffer
{
   __New(PID, size) {
      static flags := (PROCESS_VM_OPERATION := 0x8) | (PROCESS_VM_WRITE := 0x20) | (PROCESS_VM_READ := 0x10)
           , Params := ["UInt", MEM_COMMIT := 0x1000, "UInt", PAGE_READWRITE := 0x4, "Ptr"]
         
      if !this.hProc := DllCall("OpenProcess", "UInt", flags, "Int", 0, "UInt", PID, "Ptr")
         throw Exception("Can't open remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      
      if !this.ptr := DllCall("VirtualAllocEx", "Ptr", this.hProc, "Ptr", 0, "Ptr", size, Params*) {
         DllCall("CloseHandle", "Ptr", this.hProc)
         throw Exception("Can't allocate memory in remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      }
   }
   __Delete() {
      DllCall("VirtualFreeEx", "Ptr", this.hProc, "Ptr", this.ptr, "UInt", 0, "UInt", MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", "Ptr", this.hProc)
   }  
   Read(ByRef localBuff, size, offset = 0) {
      VarSetCapacity(localBuff, size, 0)
      if !DllCall("ReadProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", &localBuff, "Ptr", size, "PtrP", bytesRead)
         throw Exception("Can't read data from remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Read")
      Return bytesRead
   }
   Write(pData, size, offset = 0) {
      if !res := DllCall("WriteProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", pData, "Ptr", size, "PtrP", bytesWritten)
         throw Exception("Can't write data to remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Write")
      Return bytesWritten
   }
}

6

Re: AHK: Поиск в Notepad++ с помощью Scintilla

В продолжение темы поиска в Notepad++ — код выше позволяет найти и выделить фразу, но я хотел бы получить сам текст найденной фразы, поскольку поиск идет по регулярному выражению.
Я попробовал использовать Scintilla-команду SCI_GETTARGETTEXT. Добавил ее в код поиска:



SCI_SETSEL          := 2160
SCI_SETSEARCHFLAGS  := 2198
SCFIND_REGEXP 		:= 0x00200000
SCI_SETTARGETSTART 	:= 2190
SCI_SETTARGETEND 	:= 2192
SCI_SEARCHINTARGET 	:= 2197
SCI_GETTARGETSTART 	:= 2191
SCI_GETTARGETEND 	:= 2193   
SCI_GETSEARCHFLAGS 	:= 2199

ControlGet, hScintilla, hwnd,, Scintilla1, ahk_class Notepad++
if !hScintilla {
   MsgBox, Scintilla not found
   ExitApp
}

;--- Устанавливаем флаги поиска SCI_SETSEARCHFLAGS
SendMessage, SCI_SETSEARCHFLAGS, SCFIND_REGEXP,,, ahk_id %hScintilla% ;опция поиска, когда строку поиска следует интерпретировать как регулярное выражение}

;Получаем длину всего текста в редакторе
SendMessage, SCI_GETTEXTLENGTH := 2183, 0,,, ahk_id %hScintilla%
ДлинаТекста := ErrorLevel
; MsgBox ДлинаТекста: '%ДлинаТекста%'

;Получаем номер текущей позиции курсора во всем тексте
SendMessage, SCI_GETCURRENTPOS := 2008, 0,,, ahk_id %hScintilla%
currentPosition := ErrorLevel
; MsgBox currentPosition: %currentPosition%

;--- Устанавливаем целевой диапазон поиска — от начала до конца текста
SendMessage, SCI_SETTARGETSTART, 0,,, ahk_id %hScintilla%
SendMessage, SCI_SETTARGETEND, ДлинаТекста,,, ahk_id %hScintilla%

;--- Производим поиск с помощью регулярных выражений
firstMatchPos := Func_SEARCHINTARGET(hScintilla, "русск.+?поиска") ;ищем русский текст
;в firstMatchPos — позиция начала найденного текста или -1, если не нашли
; MsgBox firstMatchPos: '%firstMatchPos%'  

;--- Получаем позиции найденной фразы, помещенные в TARGET
 SendMessage, SCI_GETTARGETSTART,,,, ahk_id %hScintilla%
 foundStart := ErrorLevel
 ; MsgBox foundStart: '%foundStart%' ;выводит 0

 SendMessage, SCI_GETTARGETEND,,,, ahk_id %hScintilla%
 foundEnd := ErrorLevel
 ; MsgBox foundEnd: '%foundEnd%' ;выводит 0

; Прокрутить экран до найденной фразы и установить на нее курсор
SendMessage, SCI_SETSEL, foundStart, foundEnd,, ahk_id %hScintilla%

НайденныйТекст := GETTARGETTEXT(WinExist("ahk_class Notepad++")) ;получаем выделенный текст слов в Notepad++
MsgBox НайденныйТекст: '%НайденныйТекст%'

GETTARGETTEXT(hNPP)  {
;Получить ;получаем текст строки в Notepad++ по ее номеру (начиная с 0). См. C:\!!Work\AutoHotkey.docx{[Текст_строки_по_номеру]}
;31.07.22 Сделал на основе функции Получить текст текущей строки в Notepad++, просто заменил заменил SCI_GETCURLINE := 2027 на SCI_GETLINE := 2153, %НомерСтроки%

   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_GETTARGETTEXT := 2687
      
   charCount := ErrorLevel
   if (charCount < 2)
      Return
   
   MsgBox charCount: '%charCount%' ;длина найденного текста
   
   remoteBuff := new RemoteBuffer(PID, charCount)
   SendMessage, SCI_GETTARGETTEXT := 2687,, 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
   }
}
   

Func_SEARCHINTARGET(hScintilla, text) 
;Функция поиска в Notepad++ с помощью регулярного выражения
{
	SCI_SEARCHINTARGET := 2197
	firstMatchPos := -1
	WinGet, PID, PID, ahk_id %hScintilla%
	; size := StrPut(text, "UTF-8") ;чтобы работал поиск кириллицы в файле с кодировкой UTF-8
	size := StrPut(text, "CP1251") ;чтобы работал поиск кириллицы в файле с ANSI-кодировкой
	RB := new RemoteBuffer(PID, size) ;создаем новый RemoteBuffer
	VarSetCapacity(buf, size, 0)
	; StrPut(text, &buf, "UTF-8");чтобы работал поиск кириллицы в файле с кодировкой UTF-8
	StrPut(text, &buf, "CP1251") ;чтобы работал поиск кириллицы в файле с ANSI-кодировкой
	RB.Write(&buf, size)
	SendMessage, SCI_SEARCHINTARGET, 10, RB.ptr,, ahk_id %hScintilla%
	firstMatchPos := ErrorLevel
	Return firstMatchPos
}


class RemoteBuffer
{
   __New(PID, size) {
      static flags := (PROCESS_VM_OPERATION := 0x8) | (PROCESS_VM_WRITE := 0x20) | (PROCESS_VM_READ := 0x10)
           , Params := ["UInt", MEM_COMMIT := 0x1000, "UInt", PAGE_READWRITE := 0x4, "Ptr"]
         
      if !this.hProc := DllCall("OpenProcess", "UInt", flags, "Int", 0, "UInt", PID, "Ptr")
         throw Exception("Can't open remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      
      if !this.ptr := DllCall("VirtualAllocEx", "Ptr", this.hProc, "Ptr", 0, "Ptr", size, Params*) {
         DllCall("CloseHandle", "Ptr", this.hProc)
         throw Exception("Can't allocate memory in remote process PID = " . PID . "`nA_LastError: " . A_LastError, "RemoteBuffer.__New")
      }
   }
   __Delete() {
      DllCall("VirtualFreeEx", "Ptr", this.hProc, "Ptr", this.ptr, "UInt", 0, "UInt", MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", "Ptr", this.hProc)
   }  
   Read(ByRef localBuff, size, offset = 0) {
      VarSetCapacity(localBuff, size, 0)
      if !DllCall("ReadProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", &localBuff, "Ptr", size, "PtrP", bytesRead)
         throw Exception("Can't read data from remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Read")
      Return bytesRead
   }
   Write(pData, size, offset = 0) {
      if !res := DllCall("WriteProcessMemory", "Ptr", this.hProc, "Ptr", this.ptr + offset, "Ptr", pData, "Ptr", size, "PtrP", bytesWritten)
         throw Exception("Can't write data to remote buffer`nA_LastError: " . A_LastError, "RemoteBuffer.Write")
      Return bytesWritten
   }
}

Но

MsgBox НайденныйТекст: '%НайденныйТекст%'

почему-то возвращает пустую строку, хотя в C++ аналогичный код работает.

Делал подпрограмму GETTARGETTEXT по аналогии с GetSelTextFromNPP(hNPP)  — получить выделенный текст. Она вот отсюда: https://forum.script-coding.com/viewtop … 88#p112088 и хорошо работает.
В чем на этот раз может быть ошибка, что попробовать?

7

Re: AHK: Поиск в Notepad++ с помощью Scintilla

Vadus пишет:
remoteBuff.Read(&localBuff, charCount)

Здесь нужно передавать не адрес, а саму переменную, смотрите, что принимает метод Read().

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: Vadus, 2022-09-12 00:59:30)

Re: AHK: Поиск в Notepad++ с помощью Scintilla

Отлично, работает, огромное спасибо!