Проблема с горячими клавишами в скрипте Topic is solved

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

Проблема с горячими клавишами в скрипте

22 Apr 2023, 12:06

Здравствуйте. Есть код - назначение горячих клавиш. В форме редактирования указывается горячая клавиша для создания скриншотов и путь их сохранения. Также в форме есть настройка горячих клавиш для действий в программе (автоматические вызовы). Но Autohotkey не запускает скрипт - появляется ошибка "Invalid hotkey". Что может быть причиной? Клавиши в форме (LWin и Esc) точно написаны правильно.
Код:

Code: Select all

#SingleInstance Force

MsgBox, 4, Program1, Вы хотите изменить настройки запуска? `nProgram1 пропустит этот шаг через несколько секунд..., 5
Sleep, 1000
Send, {TAB}{SPACE} ; вариант «Нет» выбирается автоматически через 5 секунд
IfMsgBox Yes ; если выбрано "Да"
{
; Reading the saved settings from the AppLauncher.ini file
IniRead, viKeyScreen, AppLauncher.ini, Settings, KeyScreen, LWin
IniRead, viKeyCall, AppLauncher.ini, Settings, KeyCall, Esc
IniRead, viFolder, AppLauncher.ini, Settings, Folder, %A_Space%
IniRead, viNames, AppLauncher.ini, Settings, Names, Work photo

HotKey, %viKeyScreen%, MyKeyScreen
HotKey, %viKeyCall%, MyKeyCall

; Создается окно с заголовками, текстовыми полями и кнопками
Gui, New
Gui, Add, Text, XM Y+M W70 R1, Скриншоты
Gui, Add, Edit, X+10 YP W200 R1 vHotKey_KeyScreen, %viKeyScreen%

Gui, Add, Text, XM Y+M W70 R1, Автозвонки
Gui, Add, Edit, X+10 YP W200 R1 vHotKey_KeyCall, %viKeyCall%

Gui, Add, Text, XM Y+M W280 R1, Настройки скриншотов (клавиша в "Скриншоты"):
Gui, Add, Text, XM+20 Y+M W130, Шаг 1. Имена файлов:
Gui, Add, Edit, X+10 YP W120 R1 vEd_Names, %viNames%
Gui, Add, Text, XM+20 Y+M W130, Шаг 2. Рабочая папка:
Gui, Add, Edit, X+10 YP W100 R1 vEd_Folder, %viFolder%
Gui, Add, Button, X+0 YP W20 R1 vBt_Folder gOnButtonFolder, ...
Gui, Add, Text, XM Y+M W280 R1, Настройка автозвонков (клавиша в "Автозвонки"):
Gui, Add, Text, XM+205 YP+15 W20 R1, X
Gui, Add, Text, XM+255 YP W20 R1, Y
Gui, Add, Text, XM+20 Y+M W160 R1, Шаг 1. Кнопка "Позвонить"
; Gui, Add, Edit, X+10 YP W40 R1 vEd_CordCallx, %viCordCallx%
; Gui, Add, Edit, X+10 YP W40 R1 vEd_CordCally, %viCordCally%
Gui, Add, Text, XM+20 Y+M W160 R1, Шаг 2. Выбрать телефонию
; Gui, Add, Edit, X+10 YP W40 R1 vEd_CordSIPx, %viCordSIPx%
; Gui, Add, Edit, X+10 YP W40 R1 vEd_CordSIPy, %viCordSIPy%
Gui, Add, Text, XM+20 Y+M W160 R1, Шаг 3. Подтвердить звонок
; Gui, Add, Edit, X+10 YP W40 R1 vEd_CordOpenx, %viCordOpenx%
; Gui, Add, Edit, X+10 YP W40 R1 vEd_CordOpeny, %viCordOpeny%

Gui, Add, Button, XM Y+M+10 W285 R3 vBt_Run gOnButtonRun, Начать работу
Gui, Add, Button, XM Y+M W140 R1 vBt_Save gOnButtonSave, Сохранить
Gui, Add, Button, X+5 YP W140 R1 vBt_Exit gOnButtonExit, Выйти

Gui, Show,, App Launcher
Return

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

; Когда вы нажимаете «Сохранить», значения из текстовых полей сохраняются в файл настроек AppLauncher.ini.
OnButtonSave:
	Gui, Submit, NoHide
	IniWrite, %HotKey_KeyScreen%, AppLauncher.ini, Settings, KeyScreen
	IniWrite, %HotKey_KeyCall%, AppLauncher.ini, Settings, KeyCall
	IniWrite, %Ed_Folder%, AppLauncher.ini, Settings,Folder
	IniWrite, %Ed_Names%, AppLauncher.ini, Settings, Names
	Sleep 1000
	MsgBox, 64, Настройка Program1, настройки Program1 успешно сохранены!, 3
	Return

; Нажатие на кнопку с многоточием открывает окно выбора папки
OnButtonFolder:
	FileSelectFolder, vOutFolder, %A_ScriptDir%, 3, Выберите папку с вашими рабочими скриншотами (которую вы указали при настройке Program1)
	If (ErrorLevel == 0)
	GuiControl, Text, Ed_Folder, %vOutFolder%
Return

; При нажатии на кнопку Start запускаем приложение с данными указанными в текстовых полях
OnButtonRun:
	TrayTip, Запуск Program1, Program1 запущена!, 5
 	WinHide, A
 	Return

MyKeyScreen::
MakeScreenshot(filename := "%Ed_Names%.png") 
{
 count := 0
 Loop {
 count += 1
 filename := "%Ed_Folder%\%Ed_Names%(" . count . ").png"
 if !FileExist(filename) {
  break
 }
 }
	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 
}
Return

	MyKeyCall::
	MouseMove, 111, 222
	Click 333, 444
	Sleep 1000
	Click 555, 666
	Return

}
else ; если выбрано "Нет"
{

	IniRead, viKeyScreen, AppLauncher.ini, Settings, KeyScreen, LWin
	IniRead, viKeyCall, AppLauncher.ini, Settings, KeyCall, Esc
	IniRead, viFolder, AppLauncher.ini, Settings, Folder, %A_Space%
	IniRead, viNames, AppLauncher.ini, Settings, Names, Work photo
	TrayTip, Запуск Program1, Program1 запущена!, 5
 	WinHide, A
 	Return

	MyKeyScreen:
MakeScreenshot(filename := "%viNames%.png") 
{
 count := 0
 Loop {
 count += 1
 filename := "%viFolder%\%viNames%(" . count . ").png"
 if !FileExist(filename) {
  break
 }
 }
	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 
}
Return

MyKeyCall:
	MouseMove, 111, 222
	Click 333, 444
	Sleep 1000
	Click 555, 666
	Return

}
garry
Posts: 3788
Joined: 22 Dec 2013, 12:50

Re: Проблема с горячими клавишами в скрипте

23 Apr 2023, 01:48

Пример HOTKEY Lwin OR ESC

Code: Select all

;========== HOTKEY============================================
Filename1=GuiEditTest USE Hotkey LWin or ESC
;-
hotkey, IfWinExist,%filename1% ahk_class AutoHotkeyGUI 
hotkey,LWin,aabb,ON        
;-
hotkey, IfWinActive,%Filename1% ahk_class AutoHotkeyGUI 
Hotkey,ESC,aabc,ON
;-
Gui,2: -DPIScale hwndUID
WA:=A_screenwidth,HA:=A_screenheight,xx:=100
;-
x:=(wa*25)/xx,y:=(ha*25)/xx,w :=(wa*50 )/xx,h:=(ha*50)/xx  ;- percent calculation depending screen-size
Gui,2: Show,x%x% y%y% w%w% h%h%,%filename1%
;-
x:=(wa*5)/xx,y:=(ha*5)/xx,w :=(wa*40 )/xx,h:=(ha*10)/xx
Gui,2:add,edit,x%x% y%y% w%w% h%h% vED1 -vscroll,TEST1
return
;--------------
2GuiClose:
ExitApp

aabb:
msgbox, 262144,LWin, used HOTKEY = LWin
/*
msgbox, 262144,ESCAPE,If FILE "%filename1%".ahk EXISTs`nMINIMIZE or MAXIMIZE,4
WinGet, IsMin, MinMax, % "ahk_id " uid
if (IsMin = -1)
 WinRestore, % "ahk_id " uid
else
 Winminimize 
*/ 
return
;-
aabc:
msgbox, 262144,ESCAPE ,Used HOTKEY = ESC
;msgbox, 262144,SPACE ,Show only when FILE="%filename1%".ahk is ACTIVE`nSPACE pressed,4
return
;==========================================================
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Проблема с горячими клавишами в скрипте

23 Apr 2023, 05:13

Сейчас Autohotkey не запускает скрипт - появляется ошибка "Call to nonexistent function". Что здесь не так? Помогите, пожалуйста, я уже не понимаю, что Autohotkey от меня хочет. Я полночи пыталась менять скрипт, но ошибка никуда не уходит.
Код (с последними внесенными изменениями):

Code: Select all

MsgBox, 4, ,Program1, Вы хотите изменить настройки запуска? `n,Program1 пропустит этот шаг через несколько секунд..., 5
IfMsgBox Yes
{
IniRead, viKeyScreen, AppLauncher.ini, Settings, KeyScreen, LWin
IniRead, viKeyCall, AppLauncher.ini, Settings, KeyCall, Esc
IniRead, viCordCallx, AppLauncher.ini, Settings, CordCallx, 135
IniRead, viCordCally, AppLauncher.ini, Settings, CordCally, 130
IniRead, viCordTELx, AppLauncher.ini, Settings, CordTELx, 135
IniRead, viCordTELy, AppLauncher.ini, Settings, CordTELy, 150
IniRead, viCordOpenx, AppLauncher.ini, Settings, CordOpenx, 656
IniRead, viCordOpeny, AppLauncher.ini, Settings, CordOpeny, 206
IniRead, viCordSumx, AppLauncher.ini, Settings, CordSumx, 1280
IniRead, viCordSumy, AppLauncher.ini, Settings, CordSumy, 650
IniRead, viFolder, AppLauncher.ini, Settings, Folder, %A_Space%
IniRead, viNames, AppLauncher.ini, Settings, Names, WorkScreen

MyKeyScreen: ; этот фрагмент делает скриншоты при нажатии горячей клавиши KeyScreen (по умолчанию в форме указана LWin)
	{ 
	; Original by SKAN on D293 @ bit.ly/2krOIc9
MakeScreenshot(filename := "%Ed_Names%") 
{
    count := 0
    Loop {
        count += 1
        filename := "%Ed_Folder%\%Ed_Names%(" . count . ").png"
        if !FileExist(filename) {
            break
        }
    }
	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)
}

; By SKAN on D293 @ bit.ly/2krOIc9
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)    
}

; By SKAN on D293 @ bit.ly/2krOIc9
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  
}
	}
; конец фрагмента

MyKeyCall: ; этот фрагмент выполняет действия в окне браузера для вызова программы-телефонии при нажатии горячей клавиши KeyCall (по умолчанию в форме указана  Esc)
	{
    	MouseMove, %Ed_CordCallx%, %Ed_CordCally%
   	Click %Ed_CordTELx%, %Ed_CordTELy%
   	Sleep 1000
	Click %Ed_CordOpenx%, %Ed_CordOpeny%
	return
	}
; конец фрагмента

HotKey, %viKeyScreen%, MyKeyScreen
HotKey, %viKeyCall%, MyKeyCall


; Создаем окно с заголовками, текстовыми полями и кнопками
Gui, New

Gui, Add, Text, XM Y+M W70 R1, Скриншоты
Gui, Add, Edit, X+10 YP W200 R1 vHotKey_KeyScreen, %viKeyScreen%

Gui, Add, Text, XM Y+M W70 R1, Автозвонки
Gui, Add, Edit, X+10 YP W200 R1 vHotKey_KeyCall, %viKeyCall%

Gui, Add, Text, XM Y+M W280 R1, Настройка скриншотов (кнопка в "Скриншоты")
Gui, Add, Text, XM+20 Y+M W130, Шаг 1. Имена файлов:
Gui, Add, Edit, X+10 YP W120 R1 vEd_Names, %viNames%
Gui, Add, Text, XM+20 Y+M W130, Шаг 2. Рабочая папка:
Gui, Add, Edit, X+10 YP W100 R1 vEd_Folder, %viFolder%
Gui, Add, Button, X+0 YP W20 R1 vBt_Folder gOnButtonFolder, ...
Gui, Add, Text, XM Y+M W280 R1, Настройка автозвонков (клавиша в "Автозвонки"):
Gui, Add, Text, XM+205 YP+15 W20 R1, X
Gui, Add, Text, XM+255 YP W20 R1, Y
Gui, Add, Text, XM+20 Y+M W160 R1, Шаг 1. Кнопка вызова
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordCallx, %viCordCallx%
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordCally, %viCordCally%
Gui, Add, Text, XM+20 Y+M W160 R1, Шаг 2. Выбор телефонии
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordTELx, %viCordTELx%
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordTELy, %viCordTELy%
Gui, Add, Text, XM+20 Y+M W160 R1, Шаг 3. Подтвердить вызов
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordOpenx, %viCordOpenx%
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordOpeny, %viCordOpeny%
Gui, Add, Text, XM Y+M W285 R1, Настройка автосуммы для клиента
Gui, Add, Text, XM+20 Y+M W160 R1, Шаг 1. Выбор суммы заказа
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordSumx, %viCordSumx%
Gui, Add, Edit, X+10 YP W40 R1 vEd_CordSumy, %viCordSumy%

Gui, Add, Button, XM Y+M+10 W285 R3 vBt_Run gOnButtonRun, Начать работу
Gui, Add, Button, XM Y+M W140 R1 vBt_Save gOnButtonSave, Сохранить
Gui, Add, Button, X+5 YP W140 R1 vBt_Exit gOnButtonExit, Выйти

Gui, Show,, App Launcher
Return

; Когда окно закрывается или нажимается кнопка Выйти, сценарий завершается.
GuiClose:
OnButtonExit:
	ExitApp

; Когда вы нажимаете «Сохранить», значения из текстовых полей сохраняются в файл настроек AppLauncher.ini.
OnButtonSave:
	Gui, Submit, NoHide
 	IniWrite, %HotKey_KeyScreen%, AppLauncher.ini, Settings, KeyScreen
 	IniWrite, %HotKey_KeyCall%, AppLauncher.ini, Settings, KeyCall
	IniWrite, %Ed_CordCallx%, AppLauncher.ini, Settings, CordCallx
	IniWrite, %Ed_CordCally%, AppLauncher.ini, Settings, CordCally
	IniWrite, %Ed_CordTELx%, AppLauncher.ini, Settings, CordTELx
	IniWrite, %Ed_CordTELy%, AppLauncher.ini, Settings, CordTELy
	IniWrite, %Ed_CordOpenx%, AppLauncher.ini, Settings, CordOpenx
	IniWrite, %Ed_CordOpeny%, AppLauncher.ini, Settings, CordOpeny
	IniWrite, %Ed_CordSumx%, AppLauncher.ini, Settings, CordSumx
	IniWrite, %Ed_CordSumy%, AppLauncher.ini, Settings, CordSumy
	IniWrite, %Ed_Folder%, AppLauncher.ini, Settings,Folder
	IniWrite, %Ed_Names%, AppLauncher.ini, Settings, Names
	Sleep 1000
	MsgBox, 64, Настройка Program1, настройки Program1 успешно сохранены!, 3
	Return

; Нажатие на кнопку с многоточием открывает окно выбора папки
OnButtonFolder:
	FileSelectFolder, vOutFolder, %A_ScriptDir%, 3, Выберите папку с вашими рабочими скриншотами
	If (ErrorLevel == 0)
	GuiControl, Text, Ed_Folder, %vOutFolder%
Return

; При нажатии на кнопку Start запускаем приложение с данными, указанными в текстовых полях
OnButtonRun:
	TrayTip, Запуск Program1, Program1 запущена!
 	WinHide, A
 	Return

:*:-25::
MouseMove, %Ed_CordSumx%, %Ed_CordSumy%
Click 2
ClipSave=%ClipboardAll%
Clipboard=
Send, ^{c}
ClipWait, 2
Result:=Round(Clipboard-25,2)
MsgBox, 0, Сумма для клиента, %Result% грн,
Clipboard=%ClipSave%
Return


MyKeyScreen(%Ed_Folder%, %Ed_Names%)
MyKeyCall(%Ed_CordCallx%, %Ed_CordCally%, %Ed_CordTELx%, %Ed_CordTELy%, %Ed_CordOpenx%, %Ed_CordOpeny%)
; пыталась убрать содержимое в скобках - не помогло
}
garry
Posts: 3788
Joined: 22 Dec 2013, 12:50

Re: Проблема с горячими клавишами в скрипте

23 Apr 2023, 15:02

У меня нет опыта работы с функцией. Пример с Irfanview ( printscreen/ crop ) :

Code: Select all

irfanview=%A_ProgramFiles%\IrfanView\i_view64.exe    
F1:=a_desktop . "\" . a_now . "_test.png"
wa:=A_screenwidth,ha:=A_screenHeight,xx:=100
return
;- crop printscreen from active window
!h::
WinGetPos,x1,y1,w1,h1,A     ;- x y w h from active window
x:=(w1*11)//xx ,y:=(h1*1)//xx,w:=(w1*40)//xx,h:=(h1*40)//xx                         ;- percent calculation 
;AA=/capture=3 /crop=(%x%,%y%,%w%,%h%) /resize=(1400,) /aspectratio /convert=%F1%   ;- with resize
AA=/capture=3 /crop=(%x%,%y%,%w%,%h%) /aspectratio /convert=%F1%
;-
ifexist,%irfanview%
 {
 runwait,%irfanview% %AA%
 try run,%F1%
 }
else
 {
 msgbox, 262208, ,IRFANVIEW NOT EXISTs`n%irfanview%
 try run,https://www.irfanview.com/
 }
return
;===========================================================
mcl
Posts: 359
Joined: 04 May 2018, 16:35

Re: Проблема с горячими клавишами в скрипте  Topic is solved

23 Apr 2023, 22:24

marusa122 wrote: Я полночи пыталась менять скрипт

Code: Select all

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%

; Разбивайте код на небольшие независимые блоки (функции и подпрограммы с метками) -
; так вы сможете отлаживать их по одному и будет проще ориентироваться в коде.


ProgramName := "Program1"

; Читаем настройки - они понадобятся в любом случае.
GoSub ReadSettingsFromIni

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

; Тут, очевидно, или прошло пять секунд, или пользователь нажал Нет.
GoTo OnButtonRun
Return

; ===========================
; Конец секции автовыполнения



; Чтение настроек из .ini-файла в переменные
; ==========================================
ReadSettingsFromIni:
{
	IniRead, HotKey_KeyScreen , AppLauncher.ini, Settings, KeyScreen , LWin
	IniRead, HotKey_KeyCall   , AppLauncher.ini, Settings, KeyCall   , Esc
	
	IniRead, Ed_CordCallx , AppLauncher.ini, Settings, CordCallx , 135
	IniRead, Ed_CordCally , AppLauncher.ini, Settings, CordCally , 130
	IniRead, Ed_CordTELx  , AppLauncher.ini, Settings, CordTELx  , 135
	IniRead, Ed_CordTELy  , AppLauncher.ini, Settings, CordTELy  , 150
	IniRead, Ed_CordOpenx , AppLauncher.ini, Settings, CordOpenx , 656
	IniRead, Ed_CordOpeny , AppLauncher.ini, Settings, CordOpeny , 206
	IniRead, Ed_CordSumx  , AppLauncher.ini, Settings, CordSumx  , 1280
	IniRead, Ed_CordSumy  , AppLauncher.ini, Settings, CordSumy  , 650
	
	IniRead, Ed_Folder    , AppLauncher.ini, Settings, Folder    , %A_Space%
	IniRead, Ed_Names     , AppLauncher.ini, Settings, Names     , WorkScreen

	Return
}


; Действия по созданию горячих клавиш
; ===================================
DisableCustomHotkeys:
{
	; Прячем ошибки в случае, если была задана некорректная клавиша.
	Try {
		HotKey, %HotKey_KeyScreen%, Off
		HotKey, %HotKey_KeyCall%, Off
	}
	
	Return
}

EnableCustomHotkeys:
{
	Try {
		HotKey, %HotKey_KeyScreen%, OnKey_Screen, On
		HotKey, %HotKey_KeyCall%  , OnKey_Call, On
		
	} Catch err {
		GoSub DisableCustomHotkeys
		errorMessage := err.Message
		MsgBox, 48, %ProgramName%, Не удалось создать горячие клавиши!`n`n%errorMessage%
	}
	
	Return
}


; Создание окна настроек
; ======================
ShowSettingsWindow:
{
	Gui, New
	
	Gui, Add, Text, Xm    Ym   W70  R1,  Скриншоты:
	Gui, Add, Edit, X+10  Yp   W200 R1   vHotKey_KeyScreen,  %HotKey_KeyScreen%
	
	Gui, Add, Text, Xm    Y+m  W70  R1,  Автозвонки:
	Gui, Add, Edit, X+10  Yp   W200 R1   vHotKey_KeyCall,  %HotKey_KeyCall%
	
	Gui, Add, Text, Xm    Y+m  W280 R1,  Настройка скриншотов (кнопка в "Скриншоты")
	
	Gui, Add, Text  , Xm+20 Y+m  W130 R1,  Шаг 1. Имена файлов:
	Gui, Add, Edit  , X+10  Yp   W120 R1   vEd_Names,  %Ed_Names%
	
	Gui, Add, Text  , Xm+20 Y+m  W130 R1,  Шаг 2. Рабочая папка:
	Gui, Add, Edit  , X+10  Yp   W100 R1   vEd_Folder,  %Ed_Folder%
	Gui, Add, Button, X+0   Yp   W20  R1   gOnButtonFolder,  ...
	
	Gui, Add, Text, Xm     Y+m   W280 R1,  Настройка автозвонков (клавиша в "Автозвонки"):
	Gui, Add, Text, Xm+205 Yp+15 W20  R1,  X
	Gui, Add, Text, Xm+255 Yp    W20  R1,  Y
	
	Gui, Add, Text, Xm+20 Y+m  W160 R1,  Шаг 1. Кнопка вызова
	Gui, Add, Edit, X+10  Yp   W40  R1   vEd_CordCallx, %Ed_CordCallx%
	Gui, Add, Edit, X+10  Yp   W40  R1   vEd_CordCally, %Ed_CordCally%
	
	Gui, Add, Text, Xm+20 Y+m  W160 R1,  Шаг 2. Выбор телефонии
	Gui, Add, Edit, X+10  Yp   W40  R1   vEd_CordTELx, %Ed_CordTELx%
	Gui, Add, Edit, X+10  Yp   W40  R1   vEd_CordTELy, %Ed_CordTELy%
	
	Gui, Add, Text, Xm+20 Y+m  W160 R1,  Шаг 3. Подтвердить вызов
	Gui, Add, Edit, X+10  Yp   W40  R1   vEd_CordOpenx, %Ed_CordOpenx%
	Gui, Add, Edit, X+10  Yp   W40  R1   vEd_CordOpeny, %Ed_CordOpeny%
	
	Gui, Add, Text, Xm    Y+m  W285 R1,  Настройка автосуммы для клиента
	Gui, Add, Text, Xm+20 Y+m  W160 R1,  Шаг 1. Выбор суммы заказа
	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, Button, Xm  Y+m+10 W285 R3  gOnButtonRun  , Начать работу
	Gui, Add, Button, Xm  Y+m    W140 R1  gOnButtonSave , Сохранить
	Gui, Add, Button, X+5 Yp     W140 R1  gOnButtonExit , Выйти
	
	Gui, Show,, App Launcher
	Return
}


; Действия на кнопки в окне настроек
; ----------------------------------

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


; Кнопка сохранения настроек
OnButtonSave:
{
	GoSub DisableCustomHotkeys  ; Отключаем старые горячие клавиши
	Gui, Submit, NoHide
	GoSub EnableCustomHotkeys   ; Включаем новые горячие клавиши
	
	IniWrite, %HotKey_KeyScreen% , AppLauncher.ini, Settings, KeyScreen
	IniWrite, %HotKey_KeyCall%   , AppLauncher.ini, Settings, KeyCall
	
	IniWrite, %Ed_CordCallx% , AppLauncher.ini, Settings, CordCallx
	IniWrite, %Ed_CordCally% , AppLauncher.ini, Settings, CordCally
	IniWrite, %Ed_CordTELx%  , AppLauncher.ini, Settings, CordTELx
	IniWrite, %Ed_CordTELy%  , AppLauncher.ini, Settings, CordTELy
	IniWrite, %Ed_CordOpenx% , AppLauncher.ini, Settings, CordOpenx
	IniWrite, %Ed_CordOpeny% , AppLauncher.ini, Settings, CordOpeny
	IniWrite, %Ed_CordSumx%  , AppLauncher.ini, Settings, CordSumx
	IniWrite, %Ed_CordSumy%  , AppLauncher.ini, Settings, CordSumy
	
	IniWrite, %Ed_Folder%    , AppLauncher.ini, Settings, Folder
	IniWrite, %Ed_Names%     , AppLauncher.ini, Settings, Names
	
	SoundPlay, *64
	
	ToolTip, Сохранено!
	Sleep 1000
	ToolTip
	Return
}


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

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


; Автозамена '-25'
:*:-25::
{
	MouseMove, %Ed_CordSumx%, %Ed_CordSumy%
	Click 2
	
	ClipSave=%ClipboardAll%
	Clipboard=
	Send, ^{c}
	ClipWait, 2
	
	Result:=Round(Clipboard-25,2)
	MsgBox, 0, Сумма для клиента, %Result% грн
	
	Clipboard=%ClipSave%
	Return
}


; Действия для настраиваемых горячих клавиш

; этот фрагмент выполняет действия в окне браузера для вызова программы-телефонии
; при нажатии горячей клавиши KeyCall (по умолчанию в форме указана  Esc)
OnKey_Call:
{	; !!! Непонятное место: двигаем мышку в одно место, а щёлкаем в другом.
	MouseMove, %Ed_CordCallx%, %Ed_CordCally%
	Click, %Ed_CordTELx%, %Ed_CordTELy%
	Sleep, 1000
	Click, %Ed_CordOpenx%, %Ed_CordOpeny%
	Return
}


OnKey_Screen:
{
	; На случай, если пользователь ввёл что-то не то:
	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
		}
	}
	
	; Делаем снимок экрана
	MakeScreenshot( filename )
	Return
}


; Функции для создания скриншота
; By SKAN on D293 @ bit.ly/2krOIc9

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  
}
Last edited by mcl on 24 Apr 2023, 02:53, edited 3 times in total.
github://oGDIp - GDI+ wrapper for AHK v1.1
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Проблема с горячими клавишами в скрипте

24 Apr 2023, 00:53

mcl, теперь скрипт просто открывает рабочую папку (чего вообще не должен делать). А действия, назначенные для горячих клавиш, не запускаются. Например, LWin должна делать скриншоты с названиями, заданными в "Имена файлов" - "Рабочий снимок(1)", "Рабочий снимок(2)" и т.д. и сохранять их в эту рабочую папку, но вместо этого она открывает меню "Пуск" (делает то, что обычно выполняет вне работы скрипта). Я пробовала вместо "Run, %viFolder%" вставить код для автозамены и действия для настраиваемых горячих клавиш - работает только автозамена.
mcl
Posts: 359
Joined: 04 May 2018, 16:35

Re: Проблема с горячими клавишами в скрипте

24 Apr 2023, 02:57

marusa122 wrote:
24 Apr 2023, 00:53
mcl, теперь скрипт просто открывает рабочую папку (чего вообще не должен делать). А действия, назначенные для горячих клавиш, не запускаются. Например, LWin должна делать скриншоты с названиями, заданными в "Имена файлов" - "Рабочий снимок(1)", "Рабочий снимок(2)" и т.д. и сохранять их в эту рабочую папку, но вместо этого она открывает меню "Пуск" (делает то, что обычно выполняет вне работы скрипта). Я пробовала вместо "Run, %viFolder%" вставить код для автозамены и действия для настраиваемых горячих клавиш - работает только автозамена.
Каюсь, писал уже засыпая. Кажется, исправил.
github://oGDIp - GDI+ wrapper for AHK v1.1
marusa122
Posts: 135
Joined: 22 Mar 2023, 07:48

Re: Проблема с горячими клавишами в скрипте

24 Apr 2023, 03:52

mcl, огромное спасибо! Это то, что нужно!
garry
Posts: 3788
Joined: 22 Dec 2013, 12:50

Re: Проблема с горячими клавишами в скрипте

24 Apr 2023, 08:07

@mcl & @marusa122 , спасибо

Code: Select all

; ----------------------------------
; Кнопка выбора папки для сохранения скриншотов
OnButtonFolder:
	FileSelectFolder, vOutFolder,, 3
	If (ErrorLevel == 0)
		GuiControl, Text, Ed_Folder, %vOutFolder%
	gosub,onbuttonsave	 ;- <<< added new
	Return
;-------------------------------------

Return to “Помощь”

Who is online

Users browsing this forum: No registered users and 6 guests