1

Тема: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Добрый день!
Имеется скрипт, котоый написал teadrinker, который переносит построчно текст из ноутпада

Код (AutoHotKey):

   SetTitleMatchMode, 2
   TargetWindov =   ; указать целевое окно
   StringMaxLength = 200   ; указать максимальный размер копируемой строки в символах (можно больше)
 
   EM_GETLINECOUNT := 0xBA, EM_GETLINE := 0xC4
   Return
 
F11::
   ControlGet, hEdit, hwnd,, Edit1, A
   SendMessage, EM_GETLINECOUNT,,,, ahk_id %hEdit%
   Loop % ErrorLevel  ; количество строк в Edit-контроле блокнота
   {
      String =
      VarSetCapacity(String, StringMaxLength)
      NumPut(StringMaxLength, String)
      SendMessage, EM_GETLINE, A_Index - 1, &String,, ahk_id %hEdit%  ; копируем строку в переменную String
      Clipboard = %String%   ; помещаем строку в буфер обмена
 
      MsgBox, % Clipboard  ; только для демонстрации, эту строку можно удалить
 
      WinActivate, %TargetWindov%
      SendInput, t
      Sleep, 400
      WinActivate, %TargetWindov%
      SendInput, ^{vk56}   ; посылаем целевому окну Ctrl + V, вставляя текст из буфера обмена
      Sleep, 400
   }
   Return

Как его модифицировать чтобы
1) он переносил не построчно, а сразу весь текст.
2) в зависимости от количества копируемых строк делал разные с текстом действия.
допустим
if EM_GETLINECOUNT := 3
then SendInput, 3
if EM_GETLINECOUNT := 4
then SendInput, 4

Спасибо!!!

2

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Malcev, задачей форума не является писать желающим скрипты, а помогать писать скрипты людям, желающим научиться это делать. Ты разобрался, как работает предыдущий скрипт?

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

3

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Честно, понял не всё.
Я пытался эти выражения гуглить, но всё равно тёмный лес.
Слижком сложное программирование.
Как я понимаю в переменную String нужно скопировать вместо EM_GETLINE, просто весь текст, убрать цикл и создать выражение if then

4

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Мыслишь в правильном направлении, но для начала неплохо бы почитать справку по командам AHK, в частности ознакомиться с синтаксисом команды if и SendMessage. Чтобы получить текст из контрола, существует команда ControlGetText.

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

5 (изменено: Malcev, 2011-05-09 13:18:31)

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Вот всё, что удалось "родить"
Teadrinker, нужна ваша помощь

Код (AutoHotKey):

   SetTitleMatchMode, 2
   TargetWindov =   ; указать целевое окно
   StringMaxLength = 200   ; указать максимальный размер копируемой строки в символах (можно больше)
   String = "" ; обьявляем пустую строку
   MyLineCounter = 0 ; кол-во строк
 
   EM_GETLINECOUNT := 0xBA, EM_GETLINE := 0xC4
   Return
 
F11::
   ControlGet, hEdit, hwnd,, Edit1, A
   SendMessage, EM_GETLINECOUNT,,,, ahk_id %hEdit%
   Loop % ErrorLevel  ; количество строк в Edit-контроле блокнота
   {
   MyLineCounter = MyLineCounter + 1
      String = String +
      VarSetCapacity(String, StringMaxLength)
      NumPut(StringMaxLength, String)
      SendMessage, EM_GETLINE, A_Index - 1, &String,, ahk_id %hEdit%  ; прибавляем строку в переменную String 
   
   }
 
 if MyLineCounter = 3  ; если 3 строчки то ...
 {
    Clipboard = %String%   ; помещаем строки в буфер обмена
    WinActivate, %TargetWindov%
    SendInput, ^{vk56}   ; посылаем целевому окну Ctrl + V, вставляя текст из буфера обмена
    Sleep, 400
 
 } else if MyLineCounter = 4    ; если 4 строчки то ...
 {
    Clipboard = %String%   ; помещаем строки в буфер обмена
    WinActivate, %TargetWindov%
    SendInput, ^{vk56}   ; посылаем целевому окну Ctrl + V, вставляя текст из буфера обмена
    Sleep, 400
 }
  
Return

6

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Так тебе нужно, чтобы скрипт переносил текст именно из блокнота, или непосредственно из буфера обмена?

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

7 (изменено: Malcev, 2011-05-09 17:42:06)

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Мне нужно, чтобы мною выделенный текст переносился в блокнот.
В блокноте у меня заранее окошко нужного мне размера.
Соответственно вставленный текст разбивается с новым word-wrap.
И уже из блокнота в зависимости от количества строк с текстом делаются последующие действия.
Изменённый мной ваш скрипт, почему-то не работает, хотя по моей логике в нём написано всё верно.

P.S. А реально ли сделать такое, чтобы текст разбивался на строчки автоматически, миную блокнот?
Например, если одной строке задать максимальное количество знаков, если знаков больше, то находим пробел и весь текст после пробела переносим на следующую строку.
То есть, я имею ввиду делать word-wrap в самом буфере

8

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Malcev пишет:

P.S. А реально ли сделать такое, чтобы текст разбивался на строчки автоматически, миную блокнот?
Например, если одной строке задать максимальное количество знаков, если знаков больше, то находим пробел и весь текст после пробела переносим на следующую строку.
То есть, я имею ввиду делать word-wrap в самом буфере

Можно разбить текст в буфере обмена на составные части по принципу "если больше указанного количества знаков, берётся часть текста, включающая нужное количество знаков + текст до ближайшего пробела или знака переноса строки, и всё это заносится в переменную, затем по тому же принципу следующий участок текста, и так далее до конца текста в буфере". Таким образом получаем массив переменных String1, String2... в каждой из которых часть текста.

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

9

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Да. вот это именно, то что надо.
Поможете?

10

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Да, но попозже.

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

11

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Можно разбить текст в буфере обмена на составные части по принципу "если больше указанного количества знаков, берётся часть текста, включающая нужное количество знаков + текст до ближайшего пробела или знака переноса строки

Мне бы нужно было "если больше указанного количества знаков, берётся часть текста, включающая нужное количество знаков (минус) текст до ближайшего пробела или знака переноса строки.
То есть в каждой строке чтобы было не больше 20 знаков.
Если больше, то идём назад до пробела и переносим.

12

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

А сам последний пробел или знак переноса строки включаем?

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

13

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Допустим, при таком тексте

Мама мыла раму.
Маша ела кашу.

Получим при максимуме в 10 знаках

Мама мыла
раму.
Маша ела
кашу.

14

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

; для демонстрации
Clipboard =
(
Мама мыла раму.
Маша ела кашу.
)

MaxSigns = 10  ; заменить на нужное
i := n := PrevEndPos := 1

StringReplace, Clipboard, Clipboard, `r,, 1
Length := StrLen(Clipboard)
Loop, parse, ClipBoard
{
   if (A_Index = Length)
      EndPos := A_Index + 1
   if (A_LoopField = " " || A_LoopField = "`n")
      EndPos := A_Index
   if (A_Index = Length || A_LoopField = "`n" || i = MaxSigns + 1)
   {
      String%n% := SubStr(ClipBoard, PrevEndPos, EndPos - PrevEndPos)
      PrevEndPos := EndPos + 1, i := A_Index - EndPos, n++
   }
   i++
}
; для демонстрации
While String%A_Index%
   MsgBox, % "String" A_Index " = |" String%A_Index% "|"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

Но в буфер обмена попадает

Мама мыла раму.
Маша ела кашу.

И соответственно в другую программу вставляется

Мама мыла раму.
Маша ела кашу.

16

Re: AHK: Дальнейшие действия с текстом в зависимости от количества строк

В другую программу нужно вставлять не буфер обмена, а переменные String1, String2... по очереди.

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