Скрипт не работает с настраиваемыми координатами Topic is solved

Помощь в написании скриптов
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 12 Nov 2023, 10:02

Здравствуйте. Есть скрипт Autohotkey:

Code: Select all

Loop {
	If (A_Index < 5)
		Continue
	
	If (A_Index > 99)
		Break
	
	HotString(":?*X:-" . A_Index,  "SubtractNum")
}

SubtractNum() {
	MouseMove, 1280, 650
	Click 2
	ClipSave=%ClipboardAll%
	Clipboard=
	RegexMatch(A_ThisHotkey, "(?<=-)\d+", vNumber)
	Clipboard=
	Send, ^{c}
	ClipWait, 2
	
	Result:=Round(Clipboard-vNumber,2)
	MsgBox, 0, Итоговая сумма, %Result%
	Clipboard=%ClipSave%
	Return
}
Он работает прекрасно - вычитает набранное на клавиатуре число из выделенного в определенном участке текста.
Почему же тогда не работает такая его версия?

Code: Select all

ReadSettingsFromIni:
{
	IniRead, Ed_CordSumx , %A_ScriptDir%\Настройки.ini, Settings, CordSumx , 1280
	IniRead, Ed_CordSumy , %A_ScriptDir%\Настройки.ini, Settings, CordSumy , 650
	Return
}

; код пользовательской формы для настройки скрипта и сохранения настроек с помощью IniWrite

GoSub ReadSettingsFromIni

Loop {
	If (A_Index < 5)
		Continue
	
	If (A_Index > 49)
		Break
	
	HotString(":?*X:-" . A_Index,  "SubtractNum")
}

SubtractNum() {
	MouseMove %Ed_CordSumx%, %Ed_CordSumy%
	Click 2
	ClipSave=%ClipboardAll%
	Clipboard=
	RegexMatch(A_ThisHotkey, "(?<=-)\d+", vNumber)
	Clipboard=
	Send, ^{c}
	ClipWait, 2
	
	Result:=Round(Clipboard-vNumber,2)
	MsgBox, 0, Итоговая сумма, %Result%
	Clipboard=%ClipSave%
	Return
}
%Ed_CordSumx%, %Ed_CordSumy% - те же координаты 1280, 650, они сохранены и читаются из Настройки.ini с помощью IniRead (соответствующие команды добавлены в начало скрипта). Но с таким вариантом координат скрипт не работает. Как это исправить?

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 12 Nov 2023, 12:24

@marusa122, привет!

Code: Select all

MouseMove, % Ed_CordSumx, Ed_CordSumy
Либо вообще убрать все знаки процента

Code: Select all

MouseMove, Ed_CordSumx, Ed_CordSumy
Попробуй сама - как заработает, так и правильно :lol:
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 12 Nov 2023, 12:41

@vmech, привет!
Ни помогло ни то, ни другое...

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 12 Nov 2023, 13:03

@marusa122
Лови.
Тело подпрограммы чтения настроек необходимо переместить в самый конец скрипта.
В функцию SubtractNum() добавить Global. Иначе значения переменных из неё не видно, и поэтому мыше тупо некуда перемещаться.

Code: Select all

#Requires Autohotkey v1.1

GoSub ReadSettingsFromIni

Loop {
	If (A_Index < 5)
		Continue
	
	If (A_Index > 49)
		Break
	
	HotString(":?*X:-" . A_Index,  "SubtractNum")
}

SubtractNum() {
	Global
	ClipSave=%ClipboardAll%
	Clipboard=
	RegexMatch(A_ThisHotkey, "(?<=-)\d+", vNumber)
	MouseMove, %Ed_CordSumx%, %Ed_CordSumy%
	Click 2
	Send, ^{c}
	ClipWait, 2
	
	Result:=Round(Clipboard-vNumber,2)
	MsgBox, 0, Итоговая сумма, %Result%
	Clipboard=%ClipSave%
	Return
}

; код пользовательской формы для настройки скрипта и сохранения настроек с помощью IniWrite

ReadSettingsFromIni:
{
	IniRead, Ed_CordSumx, %A_ScriptDir%\Настройки.ini, Settings, CordSumx, 1280
	IniRead, Ed_CordSumy, %A_ScriptDir%\Настройки.ini, Settings, CordSumy, 650
	Return
}
ЗЫ. Есть простое правило, старайся его соблюдать, чтобы всё работало правильно:
Если вызываешь подпрограмму (НЕ функцию) через GoSub, тогда её тело должно быть размещено в теле скрипта ПОСЛЕ вызова. Но никак не ДО.

Ну а так как у тебя скрипт исполняется вообще линейно (последовательно), то лучше вообще убрать все подпрограммы (не функции) в самый конец.
А ещё лучше - оформить подпрограмму чтения настроек как функцию:

Code: Select all

#Requires Autohotkey v1.1

ReadSettingsFromIni()

Loop
{
	If (A_Index < 5)
		Continue
	If (A_Index > 49)
		Break
	HotString(":?*X:-" . A_Index,  "SubtractNum")
}

SubtractNum()
{
	Global
	ClipSave=%ClipboardAll%
	Clipboard=
	RegexMatch(A_ThisHotkey, "(?<=-)\d+", vNumber)
	MouseMove, %Ed_CordSumx%, %Ed_CordSumy%
	Click 2
	Send, ^{c}
	ClipWait, 2
	
	Result:=Round(Clipboard-vNumber,2)
	MsgBox, 0, Итоговая сумма, %Result%
	Clipboard=%ClipSave%
}

; код пользовательской формы для настройки скрипта и сохранения настроек с помощью IniWrite

ReadSettingsFromIni()
{
	Global
	IniRead, Ed_CordSumx, %A_ScriptDir%\Настройки.ini, Settings, CordSumx, 1280
	IniRead, Ed_CordSumy, %A_ScriptDir%\Настройки.ini, Settings, CordSumy, 650
}
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 12 Nov 2023, 14:59

@vmech, не помогло ни добавление Global, ни превращение подпрограммы в функцию...

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 12 Nov 2023, 15:05

@marusa122 Ерунда какая то... Как же у меня работает ?!
Скриншот
Please post your script code inside [code] ... [/code] block. Thank you.

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 12 Nov 2023, 23:01

@vmech
Ну что, скрипт «взлетел» ? Или так и «прикидывается алкашом в кустах» ?
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 13 Nov 2023, 13:44

@vmech, скрипт работает. Но как только я добавляю горячие клавиши и форму для настройки - все, "бобик сдох". Хотя горячие клавиши вообще не затрагивают координаты, по которым перемещается скрипт.
P.S. Попробовала не скрипт добавить в форму с горячими клавишами, а горячие клавиши в скрипт - перестали работать и клавиши, и скрипт. Если наоборот - не работает скрипт. И только автозамены стабильны))

Code: Select all

GoSub ReadSettingsFromIni

MsgBox, 4, %ProgramName%, Вы хотите изменить настройки запуска? `n%ProgramName% пропустит этот шаг через несколько секунд..., 5
	IfMsgBox Yes
	{
		GoSub ShowSettingsWindow
		Return
	}
	else
; Тут или прошло пять секунд, или пользователь нажал Нет.
	{
		GoTo OnButtonRun
		Return
	}

; код пользовательской формы для настройки скрипта и сохранения настроек с помощью IniWrite

ShowSettingsWindow:
{
Gui, New
	Gui, Add, Text, Xm+20 Y+m W175 R1 , Шаг 2. Выбор суммы
	Gui, Add, Edit, X+10 Yp W40 R1 vEd_CordSumx HwndField5Hwnd, %Ed_CordSumx%
	Gui, Add, Edit, X+10 Yp W40 R1 vEd_CordSumy HwndField6Hwnd, %Ed_CordSumy%
	Gui, Add, Text, Xp+20 Yp+25 W100 R1 , Обновление (Р)
	Gui, Add, Edit, X+10 Yp W165 R1 vHotKey_Refresh HwndField14Hwnd, %HotKey_KeyRefresh%

	Gui, Add, Button, Xm Y+20 W305 R3 gOnButtonRun , Начать работу
	Gui, Add, Button, Xm Y+m W150 R1 gOnButtonSave , Сохранить
	Gui, Add, Button, X+5 Yp W150 R1 gOnButtonExit , Выйти
	
	Gui, Show
	Return
}

; Кнопка сохранения настроек
OnButtonSave:
{
	GoSub DisableCustomHotkeys ; Отключаем старые горячие клавиши
	Gui, Submit, NoHide
	GoSub EnableCustomHotkeys ; Включаем новые горячие клавиши
	
	IniWrite, %HotKey_KeyRefresh% , %A_ScriptDir%\..\AppLauncher.ini, Settings, KeyRefresh
	IniWrite, %Ed_CordRefx% , %A_ScriptDir%\..\AppLauncher.ini, Settings, CordRefx
	IniWrite, %Ed_CordRefy% , %A_ScriptDir%\..\AppLauncher.ini, Settings, CordRefy
	IniWrite, %Ed_CordSumx% , %A_ScriptDir%\..\AppLauncher.ini, Settings, CordSumx
	IniWrite, %Ed_CordSumy% , %A_ScriptDir%\..\AppLauncher.ini, Settings, CordSumy
	FileSetAttrib, +H, %A_ScriptDir%\..\.AppLauncer.ini

	Sleep 100
	Msgbox, , %ProgramName%, Настройки успешно сохранены!, 3
	Return
}


; Кнопка запуска
OnButtonRun:
{
	GoSub DisableCustomHotkeys ; Отключаем старые горячие клавиши
	Gui, Submit
	GoSub EnableCustomHotkeys ; Назначаем новые горячие клавиши
	
	TrayTip, Запуск %ProgramName%, Программа %ProgramName% запущена! Для остановки щелкните ПКМ по значку %ProgramName% и выберите "Exit".
	Return
}


Loop {
	If (A_Index < 5)
		Continue
	
	If (A_Index > 49)
		Break
	
	HotString(":?*X:-" . A_Index,  "SubtractNum")
}

SubtractNum() {
	Global
	ClipSave=%ClipboardAll%
	Clipboard=
	RegexMatch(A_ThisHotkey, "(?<=-)\d+", vNumber)
	MouseMove, %Ed_CordSumx%, %Ed_CordSumy%
	Click 2
	Send, ^{c}
	ClipWait, 2
	
	Result:=Round(Clipboard-vNumber,2)
	MsgBox, 0, Итоговая сумма, %Result%
	Clipboard=%ClipSave%
	Return
}

; Автозамены
:*:а1::автозамена 1
:*:а2::автозамена 2
:*:а3::автозамена 3
:*:да::
{
	FormatTime, CurrentDateTime,, dd.MM H:mm
	SetKeyDelay 0 
	Send %CurrentDateTime% выполнено
	Return
}
	
DisableCustomHotkeys:
{
	; Прячем ошибки в случае, если была задана некорректная клавиша.
	Try {
		HotKey, %HotKey_KeyRefresh% , Off
	}
	Return
}

EnableCustomHotkeys:
{
	Try {
		HotKey, %HotKey_KeyRefresh% , OnKey_Refresh , On	
	} Catch err {
		GoSub DisableCustomHotkeys
		errorMessage := err.Message
		MsgBox, 48, %ProgramName%, Не удалось создать горячие клавиши!`nСовет: воспользуйтесь документацией по ссылке "Правописание"`n`n%errorMessage%, 5
	}	
	Return
}

OnKey_Refresh:
{
	Click, %Ed_CordRefx%, %Ed_CordRefy%
	Return
}

ReadSettingsFromIni:
{
	IniRead, Ed_CordSumx, %A_ScriptDir%\Настройки.ini, Settings, CordSumx, 1280
	IniRead, Ed_CordSumy, %A_ScriptDir%\Настройки.ini, Settings, CordSumy, 650
	IniRead, HotKey_KeyRefresh , %A_ScriptDir%\..\AppLauncher.ini, Settings, KeyRefresh , F5
	IniRead, Ed_CordRefx , %A_ScriptDir%\..\AppLauncher.ini, Settings, CordRefx , 1135
	IniRead, Ed_CordRefy , %A_ScriptDir%\..\AppLauncher.ini, Settings, CordRefy , 95
	Return
}

	; При нажатии Esc, закрытии окна или нажатии кнопки Exit скрипт завершается.
GuiClose:
GuiEscape:
OnButtonExit:
	ExitApp

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 13 Nov 2023, 13:56

marusa122 wrote:
13 Nov 2023, 13:44
@vmech, скрипт работает. Но как только я добавляю горячие клавиши и форму для настройки - все, "бобик сдох". Хотя горячие клавиши вообще не затрагивают координаты, по которым перемещается скрипт.
Ты второй раз подряд наступила на те же самые грабли :roll:
Попробую объяснить попроще
В твоём же коде «полный винегрет» :lol:
Ты используешь подпрограммы, хотстринги, кучу GoSub и даже GoTo... И всё это вперемешку - ну реально винегрет :lol:
Вобщем жесть какая то. Сложно понять куда передано управление потоком в конкретный момент.
Необходима пошаговая откладка кода скрипта, чтобы хотя бы попытаться понять что вообще происходит.
Last edited by vmech on 13 Nov 2023, 16:49, edited 4 times in total.
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 13 Nov 2023, 14:12

@vmech, но все же нормально работало до того, как понадобился этот скрипт... :crazy:

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами  Topic is solved

Post by vmech » 13 Nov 2023, 16:21

@marusa122, забирай.
  • Перетасовал все подпрограммы. Чтобы легче было отслеживать логику скрипта при отладке.
  • Исправная функция SubtractNum() уехала в самый конец - чтобы не мешать.
    Туда же уехали хотстринги автозамен, что бы не мешали - Autohotkey их прочтёт и выполнит в любом случае.
  • Задал имя скрипта переменной ProgramName.
  • Создал переменную iniFilename с полным путём до файла настроек - он будет храниться в папке со скриптом.
    Теперь в подпрограммах загрузки/сохранения настроек используется значение именно этой переменной.
    Потому что там был полный бардак - разные имена файлов, с разными путями до файлов... :crazy:
  • Автозамены проверил - все работают (т.е. сам факт автозамены происходит, для всех назначенных хотстрингов)
Я переформатировал синтаксис почти по всех строках. Прости.
Но мне так было удобнее разбираться и отлаживать код. Да и привык я к такому синтаксису больше ;)

Code: Select all

#Requires Autohotkey v1.1
ProgramName := "Awesome Script"
iniFilename := A_ScriptDir "\AppLauncher.ini"

GoSub ReadSettingsFromIni

Loop
{
	If (A_Index < 5)
		Continue
	If (A_Index > 49)
		Break
	HotString(":?*X:-" . A_Index,  "SubtractNum")
}

MsgBox, 4, % ProgramName, % "Вы хотите изменить настройки запуска?`n" ProgramName " пропустит этот шаг через несколько секунд...", 5
IfMsgBox Yes
{
	GoSub ShowSettingsWindow
	Return
}
Else  ; Тут или прошло пять секунд, или пользователь нажал Нет.
{
	GoTo OnButtonRun
	Return
}

; >>>>>>>>>> ЗДЕСЬ заканчивается секция автозапуска
; >>>>>>>>>> и скрипт переходит в режим ожидания действий пользователя

; код пользовательской формы для настройки скрипта и сохранения настроек с помощью IniWrite
ShowSettingsWindow:
; {
  Gui, New
	Gui, Add, Text, % "Xm+20 Y+m W175 R1", % "Шаг 2. Выбор суммы"
	Gui, Add, Edit, % "X+10 Yp W40 R1 vEd_CordSumx HwndField5Hwnd", % Ed_CordSumX
	Gui, Add, Edit, % "X+10 Yp W40 R1 vEd_CordSumy HwndField6Hwnd", % Ed_CordSumY
	Gui, Add, Text, % "Xp+20 Yp+25 W100 R1", % "Обновление (Р)"
	Gui, Add, Edit, % "X+10 Yp W165 R1 vHotKey_Refresh HwndField14Hwnd", % HotKey_KeyRefresh

	Gui, Add, Button, % "Xm Y+20 W305 R3 gOnButtonRun", % "Начать работу"
	Gui, Add, Button, % "Xm Y+m W150 R1 gOnButtonSave", % "Сохранить"
	Gui, Add, Button, % "X+5 Yp W150 R1 gOnButtonExit", % "Выйти"
	
	Gui, Show
	Return
; }

; Кнопка запуска
OnButtonRun:
; {
	GoSub DisableCustomHotkeys ; Отключаем старые горячие клавиши
	Gui, Submit
	GoSub EnableCustomHotkeys ; Назначаем новые горячие клавиши
	
	TrayTip, % "Запуск " ProgramName, % "Программа " ProgramName " запущена!`nДля остановки щелкните ПКМ по значку " ProgramName " и выберите «Exit»"
	Return
; }

; Кнопка сохранения настроек
OnButtonSave:
; {
	GoSub DisableCustomHotkeys ; Отключаем старые горячие клавиши
	Gui, Submit, NoHide
	GoSub EnableCustomHotkeys ; Включаем новые горячие клавиши
	
	IniWrite, % Ed_CordSumx, % iniFilename, % "Settings", % "CordSumX"
	IniWrite, % Ed_CordSumy, % iniFilename, % "Settings", % "CordSumY"
	IniWrite, % Ed_CordRefx, % iniFilename, % "Settings", % "CordRefX"
	IniWrite, % Ed_CordRefy, % iniFilename, % "Settings", % "CordRefY"
	IniWrite, % HotKey_KeyRefresh, % iniFilename, % "Settings", % "KeyRefresh"
	FileSetAttrib, % "+H", % iniFilename

	Sleep 100
	Msgbox, , % ProgramName, % "Настройки успешно сохранены!", 3
	Return
; }

ReadSettingsFromIni:
; {
	IniRead, Ed_CordSumX, % iniFilename, % "Settings", % "CordSumX", 1280
	IniRead, Ed_CordSumY, % iniFilename, % "Settings", % "CordSumY", 650
	IniRead, Ed_CordRefX, % iniFilename, % "Settings", % "CordRefX", 1135
	IniRead, Ed_CordRefY, % iniFilename, % "Settings", % "CordRefY", 95
	IniRead, HotKey_KeyRefresh, % iniFilename, % "Settings", % "KeyRefresh", % "F5"
	Return
; }

DisableCustomHotkeys:
; {
	; Прячем ошибки в случае, если была задана некорректная клавиша.
	Try
		HotKey, % HotKey_KeyRefresh, % "Off"
	Return
; }

EnableCustomHotkeys:
; {
	Try
		HotKey, % HotKey_KeyRefresh, % "OnKey_Refresh", % "On"
	Catch err
	{
		GoSub DisableCustomHotkeys
		errorMessage := err.Message
		MsgBox, 48, % ProgramName, % "Не удалось создать горячие клавиши!`nСовет: воспользуйтесь документацией по ссылке «Правописание»`n`n" errorMessage, 5
	}	
	Return
; }

OnKey_Refresh:
; {
	Click, %Ed_CordRefX% %Ed_CordRefY%
	Return
; }

; Автозамены
:*:а1::автозамена 1
:*:а2::автозамена 2
:*:а3::автозамена 3
:*:да::
{
	FormatTime, CurrentDateTime,, % "dd.MM H:mm"
	SetKeyDelay, 0
	Send, % CurrentDateTime " выполнено"
	Return
}

SubtractNum()
{
	Global
	ClipSave := ClipboardAll
	Clipboard := ""
	RegexMatch(A_ThisHotkey, "(?<=-)\d+", vNumber)
	MouseMove, % Ed_CordSumX, % Ed_CordSumY
	Click, 2
	Send, ^{c}
	ClipWait, 2
	
	Result := Round(Clipboard - vNumber, 2)
	MsgBox, 0, % "Итоговая сумма", % Result
	Clipboard := ClipSave
}

; При нажатии Esc, закрытии окна или нажатии кнопки Exit скрипт завершается.
GuiClose:
GuiEscape:
OnButtonExit:
	ExitApp
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 14 Nov 2023, 01:28

@vmech, привет. Скрипт работает отлично. Но!.. Попробовала добавить еще несколько контролов и еще одну горячую клавишу - и он поломался. Ругается на эту горячую клавишу, хотя она точно указана правильно. Пробовала поменять ее на какой-нибудь F1 - продолжает ругаться. Я даже не могу проверить, работают ли добавленные контролы. Ну что опять не так?((

Code: Select all

#Requires Autohotkey v1.1
ProgramName := "Awesome Script"
iniFilename := A_ScriptDir "\AppLauncher.ini"

GoSub ReadSettingsFromIni

Loop
{
	If (A_Index < 5)
		Continue
	If (A_Index > 49)
		Break
	HotString(":?*X:-" . A_Index,  "SubtractNum")
}

MsgBox, 4, % ProgramName, % "Вы хотите изменить настройки запуска?`n" ProgramName " пропустит этот шаг через несколько секунд...", 5
IfMsgBox Yes
{
	GoSub ShowSettingsWindow
	Return
}
Else  ; Тут или прошло пять секунд, или пользователь нажал Нет.
{
	GoTo OnButtonRun
	Return
}

; >>>>>>>>>> ЗДЕСЬ заканчивается секция автозапуска
; >>>>>>>>>> и скрипт переходит в режим ожидания действий пользователя

; код пользовательской формы для настройки скрипта и сохранения настроек с помощью IniWrite
ShowSettingsWindow:
; {
  Gui, New
	Gui, Add, Text, % "Xm+20 Ym W175 R1", % "Шаг 2. Выбор суммы"
	Gui, Add, Edit, % "X+10 Yp W40 R1 vEd_CordSumx", % Ed_CordSumX
	Gui, Add, Edit, % "X+10 Yp W40 R1 vEd_CordSumy", % Ed_CordSumY
	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Обновление (Р)"
	Gui, Add, Edit, % "X+10 Yp W165 R1 vHotKey_Refresh", % HotKey_KeyRefresh
	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Скриншоты"
	Gui, Add, Edit, % "X+10 Yp W165 R1 vHotKey_Screen", % HotKey_KeyScreen
	
	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Браузер"
	Gui, Add, Edit , % "X+10 Yp W115 R1 vEd_AppS", % Ed_AppS
	Gui, Add, Button, % "X+0 Yp W20 R1 gOnButtonAppS", ...
	
	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Информация"
	Gui, Add, Edit, % "X+10 Yp W40 R1 vEd_CordInfox", % Ed_CordInfox
	Gui, Add, Edit, % "X+10 Yp W40 R1 vEd_CordInfoy", % Ed_CordInfoy
	
	Gui, Add, Text , % "Xm+20 Y+m W100 R1", Имена файлов
	Gui, Add, Edit , % "X+10 Yp W135 R1 vEd_Names", % Ed_Names

	Gui, Add, Text , % "Xm+20 Y+m W100 R1", Рабочая папка:
	Gui, Add, Edit , % "X+10 Yp W115 R1 vEd_Folder", % Ed_Folder
	Gui, Add, Button, % "X+0 Yp W20 R1 gOnButtonFolder", ...

	Gui, Add, Button, % "Xm Y+20 W305 R3 gOnButtonRun", % "Начать работу"
	Gui, Add, Button, % "Xm Y+m W150 R1 gOnButtonSave", % "Сохранить"
	Gui, Add, Button, % "X+5 Yp W150 R1 gOnButtonExit", % "Выйти"
	
	Gui, Show
	Return
; }

; Кнопка выбора папки для сохранения скриншотов
OnButtonFolder:
{
	FileSelectFolder, vOutFolder,, 3, Выберите папку для сохранения рабочих скриншотов...
	If (ErrorLevel == 0)
		GuiControl, Text, Ed_Folder, %vOutFolder%
	Return
}

; Кнопка выбора расположения браузера для запуска
OnButtonAppS:
{
	FileSelectFile, vOutFile,  % 1|2|32,  %A_ScriptDir%,  Выберите расположение рабочего браузера...,  Application (*.exe)
	If (ErrorLevel == 0)
		GuiControl, Text, Ed_AppS, %vOutFile%
	Return
}

; Кнопка запуска
OnButtonRun:
; {
	GoSub DisableCustomHotkeys ; Отключаем старые горячие клавиши
	Gui, Submit
	GoSub EnableCustomHotkeys ; Назначаем новые горячие клавиши
	
	Run %Ed_AppS%
	Return
	
	TrayTip, % "Запуск " ProgramName, % "Программа " ProgramName " запущена!`nДля остановки щелкните ПКМ по значку " ProgramName " и выберите «Exit»"
	Return
; }

; Кнопка сохранения настроек
OnButtonSave:
; {
	GoSub DisableCustomHotkeys ; Отключаем старые горячие клавиши
	Gui, Submit, NoHide
	GoSub EnableCustomHotkeys ; Включаем новые горячие клавиши
	
	IniWrite, % Ed_CordSumx, % iniFilename, % "Settings", % "CordSumX"
	IniWrite, % Ed_CordSumy, % iniFilename, % "Settings", % "CordSumY"
	IniWrite, % Ed_CordRefx, % iniFilename, % "Settings", % "CordRefX"
	IniWrite, % Ed_CordRefy, % iniFilename, % "Settings", % "CordRefY"
	IniWrite, % Ed_CordInfox, % iniFilename, % "Settings", % "CordInfoX"
	IniWrite, % Ed_CordInfoy, % iniFilename, % "Settings", % "CordInfoY"
	IniWrite, % Ed_Names, % iniFilename, % "Settings", % "Names"
	IniWrite, % Ed_Folder, % iniFilename, % "Settings", % "Folder"
	IniWrite, % Ed_AppS, % iniFilename, % "Settings", % "AppStart"
	IniWrite, % HotKey_KeyRefresh, % iniFilename, % "Settings", % "KeyRefresh"
	IniWrite, % HotKey_KeyScreen, % iniFilename, % "Settings", % "KeyScreen"
	FileSetAttrib, % "+H", % iniFilename

	Sleep 100
	Msgbox, , % ProgramName, % "Настройки успешно сохранены!", 3
	Return
; }

ReadSettingsFromIni:
; {
	IniRead, Ed_CordSumX, % iniFilename, % "Settings", % "CordSumX", 1280
	IniRead, Ed_CordSumY, % iniFilename, % "Settings", % "CordSumY", 650
	IniRead, Ed_CordRefX, % iniFilename, % "Settings", % "CordRefX", 1135
	IniRead, Ed_CordRefY, % iniFilename, % "Settings", % "CordRefY", 95
	IniRead, Ed_CordInfoX, % iniFilename, % "Settings", % "CordInfoX", 210
	IniRead, Ed_CordInfoY, % iniFilename, % "Settings", % "CordInfoY", 125
	IniRead, Ed_Names, % iniFilename, % "Settings", % "Names", Screenshot
	IniRead, Ed_Folder, % iniFilename, % "Settings", % "Folder", %A_Space%
	IniRead, Ed_Folder, % iniFilename, % "Settings", % "AppStart", %A_Space%
	IniRead, HotKey_KeyRefresh, % iniFilename, % "Settings", % "KeyRefresh", % "F5"
	IniRead, HotKey_KeyScreen, % iniFilename, % "Settings", % "KeyScreen", % "LWin"
	Return
; }

DisableCustomHotkeys:
; {
	; Прячем ошибки в случае, если была задана некорректная клавиша.
	Try
		HotKey, % HotKey_KeyRefresh, % "Off"
		HotKey, % HotKey_KeyScreen, % "Off"
	Return
; }

EnableCustomHotkeys:
; {
	Try
	{
		HotKey, % HotKey_KeyRefresh, % "OnKey_Refresh", % "On"
		HotKey, % HotKey_KeyScreen, % "OnKey_Screen", % "On"
	}
	Catch err
	{
		GoSub DisableCustomHotkeys
		errorMessage := err.Message
		MsgBox, 48, % ProgramName, % "Не удалось создать горячие клавиши!`nСовет: воспользуйтесь документацией по ссылке «Правописание»`n`n" errorMessage, 5
	}	
	Return
; }

; Автозамены
:*:а1::автозамена 1
:*:а2::автозамена 2
:*:а3::автозамена 3
:*:да::
{
	FormatTime, CurrentDateTime,, % "dd.MM H:mm"
	SetKeyDelay, 0
	Send, % CurrentDateTime " выполнено"
	Return
}


OnKey_Refresh:
; {
	Click, %Ed_CordRefX% %Ed_CordRefY%
	Return
; }

OnKey_Screen:
; Original by SKAN on D293 @ bit.ly/2krOIc9
{
	; На случай, если пользователь ввёл что-то не то:
	If (Ed_Folder == "")      ; Если папка не задана
	|| (InStr(FileExist(Ed_Folder), "D") == 0) ; или такой папки не существует,
	{
		Ed_Folder := A_ScriptDir . "\Рабочие скриншоты"   ; будем класть снимки в папку со скриптом
	}
	
	If (Ed_Names == "")    ; Если имя файла не задано
	|| (InStr(Ed_Names, "<") != 0) ; или в имени файла есть недопустимые символы...
	|| (InStr(Ed_Names, ">") != 0)
	|| (InStr(Ed_Names, "?") != 0)
	|| (InStr(Ed_Names, "*") != 0)
	|| (InStr(Ed_Names, ":") != 0)
	|| (InStr(Ed_Names, "\") != 0)
	|| (InStr(Ed_Names, "/") != 0)
	|| (InStr(Ed_Names, """") != 0)
	{
		Ed_Names := "Screenshot" ; ...будем называть файлы по умолчанию
	}
	
	; Отыскиваем подходящее имя файла
	Loop {
		filename := Format("{1}\{2} ({3}).png", Ed_Folder, Ed_Names, A_Index)
		
		If !FileExist(filename) {
			Break
		}
	}
	
	; Делаем снимок экрана
	MouseMove, % Ed_CordInfox, % Ed_CordInfoy
	Sleep, 1000
	MakeScreenshot( filename )
	Msgbox,, %ProgramName%, Скриншот сохранен!, 1
	Return
}

SubtractNum()
{
	Global
	ClipSave := ClipboardAll
	Clipboard := ""
	RegexMatch(A_ThisHotkey, "(?<=-)\d+", vNumber)
	MouseMove, % Ed_CordSumX, % Ed_CordSumY
	Click, 2
	Send, ^{c}
	ClipWait, 2
	
	Result := Round(Clipboard - vNumber, 2)
	MsgBox, 0, % "Итоговая сумма", % Result
	Clipboard := ClipSave
}

; Функции для создания скриншота

MakeScreenshot(filename := "") {
	If (filename == "")
		Return
	
	X:=0,Y:=0,W:=A_ScreenWidth,H:=A_ScreenHeight
	VarSetCapacity(BITMAPINFO, 40, 0)
	NumPut(32, NumPut(1, NumPut(H, NumPut(W, NumPut(40,BITMAPINFO,"Int"),"Int"),"Int"),"Short"),"Short")
	
	hBM := DllCall("Gdi32.dll\CreateDIBSection", "Ptr",0, "Ptr",&BITMAPINFO, "Int",0, "PtrP",pBits := 0, "Ptr",0, "Int",0, "Ptr")
	sDC := DllCall("User32.dll\GetDC", "Ptr", 0, "Ptr")
	mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr", 0, "Ptr")
	DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBM)
	DllCall("Gdi32.dll\BitBlt", "Ptr",mDC, "Int",0, "Int",0, "Int",W, "Int",H, "Ptr",sDC, "Int",X, "Int",Y, "Int",0x40CC0020)
	
	GDIP("Startup")
	SavePicture(hBM, filename)
	GDIP("Shutdown")
	
	DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
	DllCall("User32.dll\ReleaseDC", "Ptr", 0, "Ptr",sDC)
	DllCall("Gdi32.dll\DeleteObject", "Ptr",hBM)
}

GDIP(C:="Startup") {
	Static SI:=Chr(!(VarSetCapacity(Si,24,0)>>16)), pToken:=0, hMod:=0, Res:=0, AOK:=0
	If (AOK := (C="Startup" and pToken=0) Or (C<>"Startup" and pToken<>0)) {
	If (C="Startup") {
		hMod := DllCall("LoadLibrary", "Str","gdiplus.dll", "Ptr")
		Res := DllCall("gdiplus\GdiplusStartup", "PtrP",pToken, "Ptr",&SI, "UInt",0)
	} Else {
		Res := DllCall("gdiplus\GdiplusShutdown", "Ptr",pToken)
		DllCall("FreeLibrary", "Ptr",hMod), hMod:=0, pToken:=0
	}} 
	Return (AOK ? !Res : Res:=0)
}

SavePicture(hBM, sFile) {
	Local V, pBM := VarSetCapacity(V,16,0)>>8, Ext := LTrim(SubStr(sFile,-3),"."), E := [0,0,0,0]
	Local Enc := 0x557CF400 | Round({"bmp":0, "jpg":1,"jpeg":1,"gif":2,"tif":5,"tiff":5,"png":6}[Ext])
	E[1] := DllCall("gdi32\GetObjectType", "Ptr",hBM ) <> 7
	E[2] := E[1] ? 0 : DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "Ptr",hBM, "UInt",0, "PtrP",pBM)
	NumPut(0x2EF31EF8,NumPut(0x0000739A,NumPut(0x11D31A04,NumPut(Enc+0,V,"UInt"),"UInt"),"UInt"),"UInt")
	E[3] := pBM ? DllCall("gdiplus\GdipSaveImageToFile", "Ptr",pBM, "WStr",sFile, "Ptr",&V, "UInt",0) : 1
	E[4] := pBM ? DllCall("gdiplus\GdipDisposeImage", "Ptr",pBM) : 1
	Return E[1] ? 0 : E[2] ? -1 : E[3] ? -2 : E[4] ? -3 : 1 
}

; При нажатии Esc, закрытии окна или нажатии кнопки Exit скрипт завершается.
GuiClose:
GuiEscape:
OnButtonExit:
	ExitApp

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 14 Nov 2023, 02:31

@marusa122 ты забыла фигурные скобки:

Code: Select all

DisableCustomHotkeys:
; {
	; Прячем ошибки в случае, если была задана некорректная клавиша.
	Try
	{
		HotKey, % HotKey_KeyRefresh, % "Off"
		HotKey, % HotKey_KeyScreen, % "Off"
	}
	Return
; }
Без них Try обработает только одну строку, которая сразу под ним.

PS. Ошибка выскакивает, потому что у тебя DisableCustomHotkeys: вызывается прежде, чем EnableCustomHotkeys:.
Т.е. ты ещё не создала хоткей с этой клавишей, но уже пытаешься её запретить.
А отсутствие фигурных скобок не оставляло Try шансов скрыть эту ошибку. Ферштейн ? :)
Last edited by vmech on 14 Nov 2023, 03:03, edited 2 times in total.
Please post your script code inside [code] ... [/code] block. Thank you.

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 14 Nov 2023, 02:44

@marusa122 в подпрограмме OnKey_Screen: неправильно обрабатывается наличие/отсутствие папки.
Если папка физически отсутствует на диске, тогда ничто никуда не сохранится, несмотря на бодрый отчёт скрипта :lol:
Замени условия в начале подпрограммы на такой код:

Code: Select all

	; На случай, если пользователь ввёл что-то не то:
	If (Ed_Folder == "")      ; Если папка не задана
		Ed_Folder := A_ScriptDir "\Рабочие скриншоты"   ; будем класть снимки в папку со скриптом
	If (InStr(FileExist(Ed_Folder), "D") == 0) ; Если такой папки не существует,
		FileCreateDir, % Ed_Folder			; тогда создадим её сами
Last edited by vmech on 14 Nov 2023, 03:05, edited 1 time in total.
Please post your script code inside [code] ... [/code] block. Thank you.

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 14 Nov 2023, 02:53

@marusa122 в ReadSettingsFromIni: ошибка.
Полагаю, имя второй переменной должно быть Ed_AppS, а не Ed_Folder:

Code: Select all

	IniRead, Ed_Folder, % iniFilename, % "Settings", % "Folder", %A_Space%
	IniRead, Ed_AppS, % iniFilename, % "Settings", % "AppStart", %A_Space%
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 14 Nov 2023, 03:03

vmech wrote:
14 Nov 2023, 02:53
Полагаю, имя второй переменной должно быть Ed_AppS, а не Ed_Folder:
@vmech, да, тут уже заметила и исправила. Большое спасибо за ликбез для особо одаренных))

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 14 Nov 2023, 03:07

@marusa122 на здоровье.
Все мы люди, все мы совершаем ошибки. На ошибках нужно учиться - это называется опыт ;)
Хорошо, когда есть кому подсказать, наставить на путь истинный :lol:

ЗЫ. Я там дополнил пост про горячую клавишу, с разъяснением что там на самом деле происходит.
Наверное стоит ещё немного поработать над логикой - пока там не всё гладко.
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 14 Nov 2023, 03:29

vmech wrote:
14 Nov 2023, 02:31
Т.е. ты ещё не создала хоткей с этой клавишей, но уже пытаешься её запретить.
@vmech, а если скрипт уже был настроен ранее, и надо поменять назначенные горячие клавиши на другие?..

vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

Re: Скрипт не работает с настраиваемыми координатами

Post by vmech » 14 Nov 2023, 03:58

marusa122 wrote:
14 Nov 2023, 03:29
@vmech, а если скрипт уже был настроен ранее, и надо поменять назначенные горячие клавиши на другие?..
Ну ты чего... Это же совсем простая задачка.

Смотри:
После стартового ReadSettingsFromIni у тебя уже заданы значения всех необходимых переменных.
Следом за ним вызываем EnableCustomHotkeys - и вот хоткеи с кнопками уже назначены.

Можно пойти ещё немного дальше, и сделать сквозной проход, просто закомментировав Return в конце DisableCustomHotkeys.
В теле скрипта обе подпрограммы расположены, очень кстати, друг за другом.

Таким образом, вызвав DisableCustomHotkeys, уже не будет нужды вызывать следом EnableCustomHotkeys - код просто продолжит исполняться сквозь метку, дойдёт до Return в конце EnableCustomHotkeys, и поток исполнения вернётся в то место, откуда была вызвана DisableCustomHotkeys.

А вызывая, при необходимости, только EnableCustomHotkeys, будет выполнен только её код - DisableCustomHotkeys и её код затронуты не будут.

Надеюсь, всё понятно объяснил ?
Please post your script code inside [code] ... [/code] block. Thank you.

marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Скрипт не работает с настраиваемыми координатами

Post by marusa122 » 14 Nov 2023, 09:33

@vmech, вроде понятно.
Сейчас пробовала с помощью GUI менять горячие клавиши - но они почему-то не меняются в AppLauncher при сохранении. Там остаются только клавиши, назначенные по умолчанию. И, соответственно, при запуске скрипта продолжают работать предыдущие клавиши. Подумала, что это я что-то поломала, вернулась к первой версии скрипта, которую ты выкладывал - но там тоже не работает сохранение изменений. Причем изменений только горячих клавиш. Все остальные изменения сохраняются.

Post Reply

Return to “Помощь”