1

Тема: AHK: Cчитать текст из файла и поместить в переменную

Доброго времени суток. Подскажите пожалуйста как можно считать текст из файла и поместить в переменную , но не весь текст а после определённого слова "MoveR" и "Delay" . После слова "MoveR" стоят две цифры первая цифра это значение для координаты "x" , вторая цифра для координаты "y", Delay - задержка.

Сам файл.

MoveR -11 8
Delay 32 ms
MoveR -6 4
Delay 32 ms
IfKey 1 0 1
MoveR -2 2
Delay 32 ms
MoveR -1 1
Delay 32 ms
MoveR 0 0
Delay 32 ms
IfKey 1 0 1
MoveR -18 15
Delay 32 ms
MoveR -1 2
Delay 32 ms
MoveR 0 0
Delay 32 ms
IfKey 1 0 1
MoveR -19 -8
Delay 32 ms
MoveR -1 -2
Delay 32 ms

Вот пример , но я не знаю как считать из файла и заполнить переменные "x" , "y" , "Delay" .

#NoEnv
#SingleInstance force
#Persistent
#NoEnv
SendMode Input
SetBatchLines, -1
#MaxHotkeysPerInterval
#HotkeyInterval, -1

Gui, Color, 9CEE90

Gui, Font, s11 Bold, Cambria

Gui, Add, Button, x20 y90 w42 h20 gOpen, Open

Gui, Add, Button, x108 y90 w42 h20 gOK, OK

Gui, Show, x557 y130 h171 w255
Return

OK:  
Gui Submit, NoHide
x := Arr[A_Index*2-1]
y := Arr[A_Index*2]
Delay := Arr[A_Index*3]
Return

Open: 
Return

#If on
*~Lbutton::
Loop
   Loop % Arr.MaxIndex() >> 1
   {
      if !GetKeyState("Lbutton", "P")
         Break 2
      
DllCall("mouse_event", uint, 1, int,  Arr[A_Index*2-1], int,  Arr[A_Index*2], uint, 0, int, 0)
      Sleep, Arr[A_Index*3]
   }
Return
#If

F12:: on := !on
GuiClose:
ExitApp
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

2

Re: AHK: Cчитать текст из файла и поместить в переменную

Воспользоваться ini-файлом?

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

3 (изменено: yalanne, 2016-06-27 17:49:16)

Re: AHK: Cчитать текст из файла и поместить в переменную

Ядрён пишет:

Вот пример

А что в самом скрипте должно происходить?
Если удерживается левая кнопка мыши(F12 вкл\выкл этой опции) то перемещаем мышь бесконечно по заданному пути, который есть в текстовом документе?
А зачем gui с кнопками?


Arr := []

text := FileOpen(A_ScriptDir "\file.txt","r").Read()
While pEx := RegExMatch(text , "O)MoveR (?<x>-?\d+) (?<y>-?\d+)(?:`r`n)?Delay (?<Delay>-?\d+)", match, pEx ? pEx : 1) + StrLen(match.0)
	Arr.Insert(match)
return
F12::on := !on
	
#if on	
*~LButton::
Loop
	for i,k in Arr
	{
		if !GetKeyState("LButton","p")
			Return
		DllCall("mouse_event", uint, 1, int,  k.x, int,  k.y, uint, 0, int, 0)
		Sleep % k.Delay
	}
Return
#if
+ с комментами
; Создаем пустой массив.
; В нем будут хранится данные ввиде: Arr[index].x  Arr[index].y \ Arr[index].Delay
Arr := [] 

;Читаем файл file.txt и заносим в переменную text.
text := FileOpen(A_ScriptDir "\file.txt","r").Read()

; Ищем нужные строки. Match уже идет здесь объектом.
; Цикл добавит  именные объекты x\y\delay в объект Arr под индексацию ввиде цифр.
While pEx := RegExMatch(text , "O)MoveR (?<x>-?\d+) (?<y>-?\d+)(?:`r`n)?Delay (?<Delay>-?\d+)", match, pEx ? pEx : 1) + StrLen(match.0)
	Arr.Insert(match)

; конец. Ждем нажатий кнопок.
return

; Переключение режима.
F12::on := !on
	
#if on	
*~LButton::
Loop
; цикл для массивов.
	for i,k in Arr
	{
		if !GetKeyState("LButton","p")
			Return
		DllCall("mouse_event", uint, 1, int,  k.x, int,  k.y, uint, 0, int, 0)
		Sleep % k.Delay
	}
Return
#if

4 (изменено: Ядрён, 2016-06-28 01:20:57)

Re: AHK: Cчитать текст из файла и поместить в переменную

yalanne пишет:
А зачем gui с кнопками?

Уважаемый yalanne таких файлов много (с разными параметрами) для мобильности что бы можно было быстро заменить один на другой. А можно вариант с Gui , нажал на кнопку открылось окно где можно выбрать файл.

Вот попробывал сделать выбор файла сам , но не получилось . Подскажите где ошибка.

Open: 

Gui Submit, NoHide

FileSelectFile, SelectedFile, 1, , Загрузить макрос, *.amc

text := FileOpen(A_ScriptDir "\%SelectedFile%.amc","r").Read()
 
Return
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

5

Re: AHK: Cчитать текст из файла и поместить в переменную

И ещё заметил чем длиннее файл тем медленнее работает.Начинает шустренько но на секунде 7-10 скорость выполнения значительно падает.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

6

Re: AHK: Cчитать текст из файла и поместить в переменную

yalanne огромное вам спасибо за помощь.

Вот решил без Gui , додумался сам.


*~vk5B::
FileSelectFile, SelectedFile, 24, , Загрузить макрос, *.amc

text := FileOpen(SelectedFile,"r").Read()
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

7

Re: AHK: Cчитать текст из файла и поместить в переменную

Заметил кое что странное в работе скрипта . Когда загружаешь коротенький скрипт он его исполняет ну очень быстро(не так ка должно быть) , такое ощущение что с задержкой чтото не то.Хотя даже незнаю на что думать. Помогите разобраться пожалуйста.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

8 (изменено: yalanne, 2016-06-29 21:14:35)

Re: AHK: Cчитать текст из файла и поместить в переменную

Может последнюю переменную не правильно RegEx видит.
Можно попробовать посмотреть что выдает скрипт в этих параметрах:

*~vk5B::
FileSelectFile, SelectedFile, 24, , Загрузить макрос, *.amc

Arr := []

text := FileOpen(SelectedFile,"r").Read()
While pEx := RegExMatch(text , "O)MoveR (?<x>-?\d+) (?<y>-?\d+)(?:`r`n)?Delay (?<Delay>-?\d+)", match, pEx ? pEx : 1) + StrLen(match.0)
	Arr.Insert(match)
return
F12::on := !on
	
#if on	
*~LButton::
Loop
	for i,k in Arr
	{
		if !GetKeyState("LButton","p")
			Return
		;DllCall("mouse_event", uint, 1, int,  k.x, int,  k.y, uint, 0, int, 0)
		;Sleep % k.Delay
		ToolTip % "index:`t" i
		            .  "`nX:`t"	k.x
		            .  "`nY:`t" 	k.y
		            .  "`nDelay:`t"	k.Delay
		Sleep 500 ;--
	}
Return
#if

Попробуй подобную строку заменить на эту

While pEx := RegExMatch(text , "O)MoveR (?<x>-?\d+) (?<y>-?\d+)(?:`r`n)?Delay (?<Delay>-?\d+) ms", match, pEx ? pEx : 1) + StrLen(match.0)

9 (изменено: Ядрён, 2022-10-29 14:26:41)

Re: AHK: Cчитать текст из файла и поместить в переменную

Доброго времени суток. Подскажите пожалуйста почему не считывается текст из файл ''555.amc'' если я записываю его при помощи этого скрипта.

*~vk60::
  KeyWait, LButton, D 
  MouseGetPos, pos1, pos2
   WinGet, active_id, ID, A 
if !x0
    x0 := - pos1, y0 := - pos2
  Else
{
      FileAppend,% "MoveR " - pos1 - x0 " " - pos2 - y0 "`n", 555.amc
      FileAppend,% "Delay " . A_TimeSincePriorHotkey . " ms" "`n", 555.amc
      FileAppend,% "IfKey 1 0 1" "`n", 555.amc
      x0 := - pos1, y0 := - pos2
   }
 Return

Скрипт для считывания.

*~vk31::
FileSelectFile, SelectedFile, 24, , Загрузить макрос, *.amc

Arr := []

text := FileOpen(SelectedFile,"r").Read()
While pEx := RegExMatch(text , "O)MoveR (?<x>-?\d+) (?<y>-?\d+)(?:`r`n)?Delay (?<Delay>-?\d+) ms", match, pEx ? pEx : 1) + StrLen(match.0)
	Arr.Insert(match)
return
F12::on := !on
	
#if on	
*~LButton::
Loop
	for i,k in Arr
	{
		if !GetKeyState("LButton","p")
			Return
		DllCall("mouse_event", uint, 1, int,  k.x, int,  k.y, uint, 0, int, 0)
		Sleep % k.Delay
		
	}
Return
#if

P.S. Если я копирую в файл ''555.amc'' текст из первого поста то всё воспроизводится, хотя на вид ошибок  нет всё идентично.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

10

Re: AHK: Cчитать текст из файла и поместить в переменную

Ядрён
А я бы Loop, Read использовал бы. Ну каждому своё.

11

Re: AHK: Cчитать текст из файла и поместить в переменную

Спасибо разобрался, символ перевода строки (`n) был прописан с ошибкой.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

12 (изменено: Ядрён, 2022-10-29 15:23:51)

Re: AHK: Cчитать текст из файла и поместить в переменную

teadrinker Спвсибо!

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

13

Re: AHK: Cчитать текст из файла и поместить в переменную

Ядрён, для тем по играм есть своя ветка.

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

14

Re: AHK: Cчитать текст из файла и поместить в переменную

teadrinker Понял.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).