1 (изменено: ypppu, 2016-06-16 16:29:13)

Тема: AHK: Оптимизировать отзывчивость GUI

Здравствуйте! Сделал вот такой скрипт:


DetectHiddenWindows, on
OnMessage(0x201, "WM_LBUTTONDOWN")
OnMessage(0x204, "WM_RBUTTONDOWN")
SetTimer, TimeCount, 500
Gui, -Caption +AlwaysOnTop +Lastfound +ToolWindow HwndGUIhWnd
Gui, Margin, 0, 0
Gui, Color, a1a1a1
Gui, Font, w900 cRed s12
Gui, Add, Text, +Center x5 y0 w25 h20 gAddCopies
Gui, Add, Text, +Center x45 y0 w25 h20
Gui, Add, Text, +Center x87 y0 w25 h20
Gui, Add, Picture, x0 y0, 0001.png
Gui, Show, % "x"A_ScreenWidth-120 "y"A_ScreenHeight-70
Return

TimeCount:
GetCurSettings(curCopies, curBright, curContrast)
ControlSetText, Static1, %curCopies%, % "ahk_id"GUIhWnd
ControlSetText, Static2, %curBright%, % "ahk_id"GUIhWnd
ControlSetText, Static3, %curContrast%, % "ahk_id"GUIhWnd
Return

AddCopies:
NewCopies = 0
NewCopies += (curCopies + 1)
ControlSetText, WindowsForms10.EDIT.app.0.3aa54a01, %NewCopies%, iCopy

WM_LBUTTONDOWN()
{
	If A_Gui
	PostMessage, 0xA1, 2
}

WM_RBUTTONDOWN()
{
	GetCurSettings(curCopies, curBright, curContrast)
	MouseGetPos,,,,ControlName
	if ControlName = Static1
	{
		NewCopies = 0
		NewCopies := (curCopies - 1)
		ControlSetText, WindowsForms10.EDIT.app.0.3aa54a01, %NewCopies%, iCopy
	}
}

GetCurSettings(ByRef val1, ByRef val2, ByRef val3)
{
	ControlGetText, curCopies, WindowsForms10.EDIT.app.0.3aa54a01, iCopy ahk_class WindowsForms10.Window.8.app.0.3aa54a0 ;Количество
	ControlGetText, curBright, WindowsForms10.EDIT.app.0.3aa54a02, Настройки изображения ahk_class WindowsForms10.Window.8.app.0.3aa54a0 ;Яркость
	ControlGetText, curContrast, WindowsForms10.EDIT.app.0.3aa54a01, Настройки изображения ahk_class WindowsForms10.Window.8.app.0.3aa54a0 ;Контраст
	val1 := curCopies
	val2 := curBright
	val3 := curContrast
}

Его функционал меня устраивает. Всё отрабатывает надёжно и без ошибок. Но! Там есть один момент.
При клике левой мышки по текст-контроллу моего GUI, автоматически, на одну единицу, увеличивается значение в поле edit другой программы. При клике правой мышки, наоборот - это значение на единицу уменьшается. Этот процесс происходит быстро, только в первый раз и если мне нужно сделать несколько подряд изменений значения(например на три), то это происходит с маленькой паузой, что очень раздражает и просто притормаживает процесс, что является противоположностью того, ради чего я создавал этот скрипт. )))
Подскажите пожалуйста, как можно оптимизировать данную задачу?
(прошу не пинать за огрехи в коде(уверен таковые там имеются), код сделан нубски, "собирательным" методом... )

2

Re: AHK: Оптимизировать отзывчивость GUI

SetWinDelay?
SetControlDelay?

3

Re: AHK: Оптимизировать отзывчивость GUI

Пример:

Gui, +hwndhGui
Gui, Add, Text, w100 h50 +0x5
Gui, Add, Text, wp, 0
Gui, Show
Return

GuiClose:
	ExitApp

#If CursorOverControl(hGui)
LButton::
RButton::
	GuiControlGet, number,, Static2
	GuiControl,, Static2, % A_ThisHotkey = "LButton" ? ++number : --number
	Return
#If
	
CursorOverControl(hGui)
{
	MouseGetPos,,, hwnd, control
	Return hwnd = hGui && control = "Static1"
}

При щелчке по серому прямоугольнику левой кнопкой значение ниже будет увеличиваться, правой — уменьшаться.

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

4 (изменено: taravasya, 2016-06-19 00:16:09)

Re: AHK: Оптимизировать отзывчивость GUI

teadrinker, благодарю! немножко подредактировав под свои нужды, получил во такой код:


#If CursorOverControl(hGui)
LButton::
RButton::
	ControlGetText, curCopies, WindowsForms10.EDIT.app.0.3aa54a01, iCopy ahk_class WindowsForms10.Window.8.app.0.3aa54a0 ;Количество
	GuiControl,, Static1, % A_ThisHotkey = "LButton" ? ++curCopies : --curCopies
	ControlSetText, WindowsForms10.EDIT.app.0.3aa54a01, %curCopies%, iCopy
	Return
	
#If
CursorOverControl(hGui)
{
	MouseGetPos,,, hwnd, controlname
	Return hwnd = hGui && controlname = "Static1"
}

Но есть ещё вопрос, если не возражаете ))

Как теперь добавить условие, что-бы иметь возможность менять значение трёх разных контролов? Если обратите внимание, на код в первом посте, то увидите что у меня там есть ещё два текст-контрола, каждый из которых отображает свои значения из окна другой программы. Как Ваш код положить на все три контрола? К сожалению, я толком не понимаю, как работают директивы и как работает вот эта часть:

Return hwnd = hGui

поэтому мои потуги добавить обработку ещё двух полей, превратились в тыканья слепого котенка ((((

5

Re: AHK: Оптимизировать отзывчивость GUI

Буду за компьютером только через неделю, поэтому не возражаю, чтобы на вопросы по коду ответил кто-то другой.

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

6

Re: AHK: Оптимизировать отзывчивость GUI

Наваял вот такое:


#If CursorOverControl(hGui)
LButton::
RButton::
	MouseGetPos,,, hwnd, controlname
	if controlname = Static1
	{
		ControlGetText, curCopies, WindowsForms10.EDIT.app.0.3aa54a01, iCopy ahk_class WindowsForms10.Window.8.app.0.3aa54a0 ;Количество
		GuiControl,, Static1, % A_ThisHotkey = "LButton" ? ++curCopies : --curCopies
		ControlSetText, WindowsForms10.EDIT.app.0.3aa54a01, %curCopies%, iCopy
	}
	
	if controlname = Static2
	{
		ControlGetText, curBright, WindowsForms10.EDIT.app.0.3aa54a02, Настройки изображения ahk_class WindowsForms10.Window.8.app.0.3aa54a0 ;Яркость
		GuiControl,, Static2, % A_ThisHotkey = "LButton" ? curBright += 10 : curBright -= 10
		ControlSetText, WindowsForms10.EDIT.app.0.3aa54a02, %curBright%, Настройки изображения
	}
	
	if controlname = Static3
	{
		ControlGetText, curContrast, WindowsForms10.EDIT.app.0.3aa54a01, Настройки изображения ahk_class WindowsForms10.Window.8.app.0.3aa54a0 ;Контраст
		GuiControl,, Static3, % A_ThisHotkey = "LButton" ? curContrast += 10 : curContrast -= 10
		ControlSetText, WindowsForms10.EDIT.app.0.3aa54a01, %curContrast%, Настройки изображения
	}
	Return
	
#If
CursorOverControl(hGui)
{
	MouseGetPos,,, hwnd, controlname
	if controlname = Static1
	{
		Return hwnd = hGui && controlname = "Static1"
	}	
	
	if controlname = Static2
	{
		Return hwnd = hGui && controlname = "Static2"
	}	
	
	if controlname = Static3
	{
		Return hwnd = hGui && controlname = "Static3"
	}
	

}

С отзывчивостью контролов всё в порядке. Однако понимаю, что такое кол-во if-ов, не есть правильно. Буду весьма признателен, если кто-нибудь подскажет, как можно сократить код.

7

Re: AHK: Оптимизировать отзывчивость GUI

Return hwnd = hGui && controlname ~= "^Static(1|2|3)$"
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui