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

Помощь в написании скриптов
vmech
Posts: 467
Joined: 25 Aug 2019, 13:03

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

Post by vmech » 14 Nov 2023, 12:43

@marusa122 имена переменных различаются.
В GUI:

Code: Select all

	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
при сохранении:

Code: Select all

	IniWrite, % HotKey_KeyRefresh, % iniFilename, % "Settings", % "KeyRefresh"
	IniWrite, % HotKey_KeyScreen, % iniFilename, % "Settings", % "KeyScreen"
при чтении:

Code: Select all

	IniRead, HotKey_KeyRefresh, % iniFilename, % "Settings", % "KeyRefresh", % "F5"
	IniRead, HotKey_KeyScreen, % iniFilename, % "Settings", % "KeyScreen", % "LWin"
При Gui, Submit значения полей сохраняются в одни переменные, а при записи/чтении на/с диск[а] - другие переменные.
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, 13:32

@vmech, сделала значения переменных одинаковыми. Но теперь новые приключения - если в качестве горячей клавиши назначено F1-F12, горячая клавиша перестает работать :crazy: . Если в качестве горячих клавиш указаны Esc и Tab (например) - по скрипту работают обе. Если указаны F3 и F7 - не работает ни одна. Хотя в AppLauncher.ini они сохраняются без проблем.
GUI сейчас выглядит так:

Code: Select all

	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Обновление (Р)"
	Gui, Add, Edit, % "X+10 Yp W165 R1 vHotKey_Refresh", % HotKey_Refresh
	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Скриншоты"
	Gui, Add, Edit, % "X+10 Yp W165 R1 vHotKey_Screen", % HotKey_Screen
Сохранение:

Code: Select all

	IniWrite, % HotKey_Refresh, % iniFilename, % "Settings", % "KeyRefresh"
	IniWrite, % HotKey_Screen, % iniFilename, % "Settings", % "KeyScreen"
Чтение:

Code: Select all

	IniRead, HotKey_Refresh, % iniFilename, % "Settings", % "KeyRefresh", % "F5"
	IniRead, HotKey_Screen, % iniFilename, % "Settings", % "KeyScreen", % "LWin"

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

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

Post by vmech » 14 Nov 2023, 13:51

@marusa122 в DisableCustomHotkeys и EnableCustomHotkeys имена переменных тоже нужно поправить.

PS. В какой среде (редакторе) ты правишь скрипты ?
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, 14:00

vmech wrote:
14 Nov 2023, 13:51
в DisableCustomHotkeys и EnableCustomHotkeys имена переменных тоже нужно поправить.
Я знаю, там тоже поправляла. Итог выше :crazy:
vmech wrote:
14 Nov 2023, 13:51
PS. В какой среде (редакторе) ты правишь скрипты ?
Notepad++

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

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

Post by vmech » 14 Nov 2023, 14:09

@marusa122 у меня всё работает...
Может у тебя запущена резидентная программа, в которой уже назначены эти же клавиши, и она просто блокирует перехват этих клавиш скриптом ?

ЗЫ. В моём случае все функциональные клавиши F1-F12 задействованы в программе FAR Manager. Так вот скрипт блокирует эти клавиши, и в FAR уже невозможно ими воспользоваться, пока работает скрипт.
marusa122 wrote:
14 Nov 2023, 14:00
Notepad++
Я пользуюсь VSCodium и VSCode. В них если тыкаешь в какое то слово, тогда оно автоматически подсвечивается везде по тексту, по всему скрипту. Просто крутишь колесо мыши, и смотришь где что не так.
А можно на этом слове нажать CtrlF - и редактор их подсветит ярче, и напишет сколько их вообще есть в тексте, и на каком варианте по порядку в данный момент курсор. И находит эти слова внутри других слов, типа как это делает regexp.

Может пора сменить среду разработки ? Чисто ради удобства. Там и отладчик есть. С пошаговой отладкой.
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, 14:51

vmech wrote:
14 Nov 2023, 14:09
Может у тебя запущена резидентная программа, в которой уже назначены эти же клавиши, и она просто блокирует перехват этих клавиш скриптом ?
@vmech, до того, как я полезла менять названия переменных, скрипт работал нормально, только горячие клавиши невозможно было сохранить через GUI. А сейчас, получается, скрипт не может перехватить управление клавишами у системы?.. Поставила клавиши F1 и F2 - так они вместо того, чтобы выполнять сценарий по скрипту, выключают и включают звук.
vmech wrote:
14 Nov 2023, 14:09
Может пора сменить среду разработки ? Чисто ради удобства. Там и отладчик есть. С пошаговой отладкой.
Я только недавно из Блокнота в Notepad++ перешла. :D
Да и в моем случае никакая среда разработки не поможет, если руки растут из жо... из неожиданного с точки зрения физиологии места))
Сейчас скрипт полностью выглядит так:

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_Refresh
	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Скриншоты"
	Gui, Add, Edit, % "X+10 Yp W165 R1 vHotKey_Screen", % HotKey_Screen
	
	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_Refresh, % iniFilename, % "Settings", % "KeyRefresh"
	IniWrite, % HotKey_Screen, % 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_AppS, % iniFilename, % "Settings", % "AppStart", %A_Space%
	IniRead, HotKey_Refresh, % iniFilename, % "Settings", % "KeyRefresh", % "F1"
	IniRead, HotKey_Screen, % iniFilename, % "Settings", % "KeyScreen", % "F2"
	Return
; }

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

EnableCustomHotkeys:
; {
	Try
	{
		HotKey, % HotKey_Refresh, % "OnKey_Refresh", % "On"
		HotKey, % HotKey_Screen, % "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 == "")      ; Если папка не задана
		Ed_Folder := A_ScriptDir "\Рабочие скриншоты"   ; будем класть снимки в папку со скриптом
	If (InStr(FileExist(Ed_Folder), "D") == 0) ; Если такой папки не существует,
		FileCreateDir, % Ed_Folder			; тогда создадим её сами
	
	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
Может, я оттуда удалила что-то важное, отчего скрипт теперь гордо игнорирует F1-F12 в качестве горячих клавиш?

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

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

Post by vmech » 14 Nov 2023, 15:34

marusa122 wrote:
14 Nov 2023, 14:51
@vmech, до того, как я полезла менять названия переменных, скрипт работал нормально, только горячие клавиши невозможно было сохранить через GUI.
Я у себя поменял в точности, как ты у себя сделала - всё работает. Вообще никаких проблем.
marusa122 wrote:
14 Nov 2023, 14:51
А сейчас, получается, скрипт не может перехватить управление клавишами у системы?..
Не у СИСТЕМЫ ! Windows сама по себе никогда никаких клавиш не блокирует.
Это какая то программа, постоянно запущенная, или драйвер, блокируют доступ к этим клавишам.
marusa122 wrote:
14 Nov 2023, 14:51
Поставила клавиши F1 и F2 - так они вместо того, чтобы выполнять сценарий по скрипту, выключают и включают звук.
Так у тебя ноутбук что ли ?
Если так, то с очень высокой вероятностью проблемы вызывает ноутбучный софт, «любезно» предустановленный производителем ноутбука.
Если ты не переустанавливала Windows на нём.
А если переустанавливала, тогда это какой то из драйверов, вероятно клавиатуры, которые были установлены вручную.
По сути, он нужен чтобы расширить функционал куцей ноутбучной клавиатуры до функционала полноразмерной настольной клавиатуры. Ну и плюс всякие доп.плюшки - вроде управления громкостью на F1/F2.
marusa122 wrote:
14 Nov 2023, 14:51
Я только недавно из Блокнота в Notepad++ перешла. :D
Ну с одной стороны - если устраивает, то и менять нет большого смысла.
Но с другой стороны - именно так и находится идеал. Постоянный поиск.

Код/Кодиум, как просто редактор, как минимум не уступают Notepad++.
А именно как среда разработки программ - на 2 головы выше любых нотепадов. Уж поверь мне на слово ;)
marusa122 wrote:
14 Nov 2023, 14:51
Да и в моем случае никакая среда разработки не поможет, если руки растут из жо... из неожиданного с точки зрения физиологии места))
Ну не стоит так безапеляционно принижать свои способности. Да и руки тут совсем ни при чём.
Недостаток знаний и опыта - в это я куда охотнее поверю. А решается этот недочёт постоянной практикой.
Никто из посетителей этого форума, или любого другого, не родился программистом. Никто.
Всё решают талант и усердие.
marusa122 wrote:
14 Nov 2023, 14:51
Сейчас скрипт полностью выглядит так:
Может, я оттуда удалила что-то важное, отчего скрипт теперь гордо игнорирует F1-F12 в качестве горячих клавиш?
Да всё нормально со скриптом. Загрузил, запустил - всё работает. Проверил все кнопки от F1 до F12 - всё пучком, никаких проблем.
Но у меня норма обычный комп, с обычной настольной клавиатурой.
Из резидентных перехватчиков нажатий - только ShareX. Но она только кнопку PrintScreen перехватывает.
А, ещё foobar2000. Он задействует Win и цифры на нампаде. Больше ничего.

Ну на, попробуй мой скрипт. Я больше чем уверен, что результат будет точно такой же.

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_Refresh
	Gui, Add, Text, % "Xm+20 Y+m W100 R1", % "Скриншоты"
	Gui, Add, Edit, % "X+10 Yp W165 R1 vHotKey_Screen", % HotKey_Screen
	
	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_Refresh, % iniFilename, % "Settings", % "KeyRefresh"
	IniWrite, % HotKey_Screen, % 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_AppS, % iniFilename, % "Settings", % "AppStart", % A_Space
	IniRead, HotKey_Refresh, % iniFilename, % "Settings", % "KeyRefresh", % "F5"
	IniRead, HotKey_Screen, % iniFilename, % "Settings", % "KeyScreen", % "LWin"
	Return
; }

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

EnableCustomHotkeys:
; {
	Try
	{
		HotKey, % HotKey_Refresh, % "OnKey_Refresh", % "On"
		HotKey, % HotKey_Screen, % "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 == "")      ; Если папка не задана
		Ed_Folder := A_ScriptDir . "\Рабочие скриншоты"   ; будем класть снимки в папку со скриптом
	If (InStr(FileExist(Ed_Folder), "D") == 0)	; или такой папки не существует,
		FileCreateDir, % Ed_Folder			; создадим её сами

	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
Last edited by vmech on 14 Nov 2023, 15:59, edited 3 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, 15:48

@marusa122 сделай ка вот что.
Запусти скрипт, зайди в настройки, прибей все кнопки, сохрани настройки.
Кликни «Начать работу».
Сверни все окна, какие есть, в панель задач.
Кликни в Рабочий стол, и последовательно нажимай все кнопки от F1 до F12.
Затем дважды кликни в иконку Autohotkey в трэе, в открывшемся окне нажми Ctrl-K, и увидишь все нажатые кнопки, которые сам Autohotkey смог перехватить.
Запости снимок этого окна сюда - я тоже имею желание взглянуть :D
Как это выглядит у меня
Please post your script code inside [code] ... [/code] block. Thank you.

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

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

Post by marusa122 » 15 Nov 2023, 00:35

@vmech, пожалуйста.
В настройках выставлены F1 и F2, это я пытаюсь их нажать с запущенным скриптом. Все программы закрыты, даже браузер
Attachments
2023-11-15_07-31-44.png
2023-11-15_07-31-44.png (61.54 KiB) Viewed 1609 times

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

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

Post by vmech » 15 Nov 2023, 00:43

@marusa122 ок, F1 и F2 не работают.
Сделай, пожалуйста, в точности, как я написал - я хочу узнать какие ещё функциональные клавиши «не работают» в Autohotkey.

Хотя рецепт «противоядия» вобщем то уже ясен - избегать назначения этих клавиш в скрипте.
Они НЕ будут работать до выяснения, и устранения, причин такого их неадекватного поведения.
Please post your script code inside [code] ... [/code] block. Thank you.

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

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

Post by marusa122 » 15 Nov 2023, 00:53

@vmech, ты не поверишь - помогло отключение Hotkey Mode в БИОС. Чтобы включение/отключение звука (например) выполнялось при нажатии не F1/F2, а Fn+F1/Fn+F2. Тогда F1-F12 освобождаются для других программ (в том числе и для скриптов)

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

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

Post by vmech » 15 Nov 2023, 01:00

marusa122 wrote:
15 Nov 2023, 00:53
@vmech, ты не поверишь - помогло отключение Hotkey Mode в БИОС. Чтобы включение/отключение звука (например) выполнялось при нажатии не F1/F2, а Fn+F1/Fn+F2. Тогда F1-F12 освобождаются для других программ (в том числе и для скриптов)
Умница! Именно про это я тебе и пытался сказать, только не знал с какой стороны подойти к этой «козе» :lol:
А ты и сама, оказывается, шаришь «где собака зарыта». Молодец! Мои искренние аплодисменты :clap:
Please post your script code inside [code] ... [/code] block. Thank you.

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

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

Post by marusa122 » 15 Nov 2023, 13:00

@vmech, еще такой вопрос - возможно ли этот скрипт скомпилировать БЕЗ окна настроек, окно настроек сделать в другом GUI и оттуда же вызывать этот скрипт как отдельную программу?

Code: Select all

INIfileName := A_ScriptDir "\Настройки - Program1.ini"
TempDir := A_Temp "\Program1 - временные файлы"

FileCreateDir %TempDir%
SetWorkingDir %TempDir%

INIfileName := A_ScriptDir "\Настройки - Program1.ini"
TempDir := A_Temp "\Program1 - временные файлы"

FileCreateDir %TempDir%
SetWorkingDir %TempDir%

FileInstall, Program1 - временные файлы/Ярлык для Program1-1.png, %TempDir%/Ярлык для Program1-1.png
FileInstall, Program1 - временные файлы/Ярлык для Program1-2.png, %TempDir%/Program1-2.png
FileInstall, Program1 - временные файлы/Awesome Script.exe, %TempDir%/Awesome Script.exe

Gui, GuiMain: New
Gui, GuiMain: Font, s10
Gui, GuiMain: Add, Text, xm ym  w276 h50 center, Выберите инструмент:
Gui, GuiMain: Add, Picture, w128 h128 gA1,  %TempDir%\Ярлык для Program1-1.png
Gui, GuiMain: Add, Picture, w128 h128 gA2,  %TempDir%\Ярлык для Program1-2.png
Gui, GuiMain: Show,  xCenter yCenter, %ProgramName%
Return
A1:
{
Gui, GuiSet: New
Gui, GuiSet: Add, Text, xm ym  w276 h50 center, Здесь окно с настройками
Gui, GuiSet: Show
Return
}
A2:
{
GoSub ReadSettingsFromIni
Run,  %TempDir%/Awesome Script.exe
Return
}

; ReadSettingsFromIni

; кнопка "Сохранить" в окне с настройками
OnButtonSave: 
	GoSub DisableCustomHotkeys ; Отключаем старые горячие клавиши
	Gui, Submit, NoHide
	GoSub EnableCustomHotkeys ; Включаем новые горячие клавиши
	GoSub WriteSettingsToIni
	Return

WriteSettingsToIni:
	IniWrite, % Ed_CordSumx, % INIfileName, % "Settings", % "CordSumx"
	IniWrite, % Ed_CordSumy, % INIfileName, % "Settings", % "CordSumy"
	IniWrite, % HotKey_Refresh, % INIfileName, % "Settings", % "KeyRefresh"
; и т.д. 
	Return

; DisableCustomHotkeys...
; EnableCustomHotkeys...
; OnKey_Refresh...
; и т.д.
Предполагалось, что INI с настройками будет храниться в %A_ScriptDir%, а вызываемые сценарии в виде exe, картинки, иконки - в временных файлах (%TempDir%). Но у меня не подтягиваются горячие клавиши, хотя ReadSettingsFromIni есть перед вызовом программы :crazy: .
Сам скрипт без окна настроек:

Code: Select all

#SingleInstance Force
#NoEnv

ProgramName := "Awesome Script"

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

	TrayTip, Запуск %ProgramName%, Программа %ProgramName% запущена! Для остановки щелкните ПКМ по значку %ProgramName% и выберите "Exit".
	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 == "")      ; Если папка не задана
		Ed_Folder := A_ScriptDir . "\Рабочие скриншоты"   ; будем класть снимки в папку со скриптом
	If (InStr(FileExist(Ed_Folder), "D") == 0)	; или такой папки не существует,
		FileCreateDir, % Ed_Folder			; создадим её сами

	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 
}

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

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

Post by vmech » 15 Nov 2023, 19:41

marusa122 wrote:
15 Nov 2023, 13:00
@vmech, еще такой вопрос - возможно ли этот скрипт скомпилировать БЕЗ окна настроек, окно настроек сделать в другом GUI и оттуда же вызывать этот скрипт как отдельную программу?
Можно запускать другие скрипты командой Run/RunWait, передавая значения необходимых переменных как аргументы строки запуска.
Эти скрипты будут запускаться как абсолютно автономные сущности (в новом процессе), вообще никак не связанные ни с оригинальным скриптом, ни с каким либо из дочерних, запущенных отдельно - каждый сам по себе.
Механизмы межпроцессных взаимодействий - это тема для отдельной диссертации. Просто так дать дочернему скрипту поработать со значениями переменных из родительского - не выйдет.
Даже называть их дочерними не совсем корректно - они вообще ничего не наследуют от родительского, лишь получают значения параметров переданных через строку запуска, и должны самостоятельно разбираться, как с этими параметрами поступать.
marusa122 wrote:
15 Nov 2023, 13:00
Предполагалось, что INI с настройками будет храниться в %A_ScriptDir%, а вызываемые сценарии в виде exe, картинки, иконки - в временных файлах (%TempDir%). Но у меня не подтягиваются горячие клавиши, хотя ReadSettingsFromIni есть перед вызовом программы :crazy: .
ReadSettingsFromIni недостаточно - она просто загружает значения переменных из хранилища.
Горячими кнопками управляют [Enable]/DisableCustomHotkeys, вызывая функцию Hotkey с параметрами.
Please post your script code inside [code] ... [/code] block. Thank you.

Post Reply

Return to “Помощь”