, привет. Скрипт работает отлично. Но!.. Попробовала добавить еще несколько контролов и еще одну горячую клавишу - и он поломался. Ругается на эту горячую клавишу, хотя она точно указана правильно. Пробовала поменять ее на какой-нибудь 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