26

Re: AHK: Заполнить монитор №1 чёрным цветом по горячей клавише

serzh82saratov
А возможно ли сделать так, чтобы можно было добавлять разные цвета в строчку, а в скобочках время их показа, как в примере, и всё это по кругу? Конечно, если реализация для Вас крайне проста.

ChangeColor() {
 	Gui, Color, % Color := Color = 000000 (600000) : 000011 (600000) : 000000 (600000) : 000011 (600000) : 000000 (600000) : 0000FF (1000) : 000000 (600000)
}


И кстати, подскажите пожалуйста, в случае перехода в будущем 1-ого монитора на разрешение 1920x1200 или 1920x1080, будет ли корректно работать код?

27 (изменено: serzh82saratov, 2016-04-09 11:19:48)

Re: AHK: Заполнить монитор №1 чёрным цветом по горячей клавише

Редактирование в самой функции, время в секундах для удобства.


#SingleInstance Force
#NoEnv

oTitles := ["ahk_class Notepad ahk_exe notepad.exe"
			, "ahk_class CalcFrame ahk_exe calc.exe"]

Global hGui, Show, Manual
, Effect := 0x00080000	; 0x00000010 - расширение, 0x00080000 - затухание, 0x00000001 - слева направо, 0x00000004 - сверху вниз
, EffectDuration := 333	; длительность эффекта

Gui, -DPIScale -Caption +AlwaysOnTop +HWNDhGui +Owner
Gui, Show,% "Hide x0 y0 w" A_ScreenWidth " h" A_ScreenHeight
ChangeColor(), OnMessage(0x201, "WM_LBUTTONDOWN")

Loop
{
	Sleep, 200
	If Manual
		Continue
	SysGet, MonitorCount, MonitorCount
	If (MonitorCount <> 2)
		Continue
	SysGet, MonitorPrimary, MonitorPrimary
	MonitorSecond := MonitorPrimary = 1 ? 2 : 1
	SysGet, Mon2, Monitor, %MonitorSecond%

	For i, Title in oTitles, HasSecond := 0
	{
		If !(hWnd := WinActive(Title))
			Continue
		WinGetPos, X, Y, , , % "ahk_id" hWnd
		If (X >= Mon2Left && X <= Mon2Right && Y >= Mon2Top && Y <= Mon2Bottom && (HasSecond := 1))
			Break
	}
	If (HasSecond && !Show)
		Show()
	Else If (!HasSecond && Show)
		Show(0)
}

Escape::  ExitApp

#If !Show
1:: Show(), Manual := 1
#If

Show(_Show = 1) {
	DllCall("AnimateWindow", "Ptr", hGui, "Int", EffectDuration, "UInt", Effect|(!_Show ? 0x00010000 : 0x0))
	If _Show
	{
		Gui, Show,% "NA x0 y0 w" A_ScreenWidth " h" A_ScreenHeight
		Gui, +AlwaysOnTop
	}
	Show := _Show
}

ChangeColor() {
	Static Colors := [["FF0000", 1], ["00FF00", 2], ["0000FF", 3]], i := 0
 	Gui, Color, % Colors[i := ++i > Colors.MaxIndex() ? 1 : i][1]
	SetTimer, ChangeColor, % "-" . Colors[i][2] . "000"
}

WM_LBUTTONDOWN() {
	Show(0), Manual := 0
}
Balux пишет:

И кстати, подскажите пожалуйста, в случае перехода в будущем 1-ого монитора на разрешение 1920x1200 или 1920x1080, будет ли корректно работать код?

Да, для любых разрешений обоих мониторов, и любого размещения вторичного монитора относительно главного. При изменении этих условий не требуется перезагрузка скрипта, или собственно какие то изменения в нём.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

28

Re: AHK: Заполнить монитор №1 чёрным цветом по горячей клавише

serzh82saratov
Спасибо за реализацию, но я так понял, при закрытии плеера, не происходит обнуления таймера цвета?

Объясню в чём загвоздка, вся эта очерёдность цветов, нужна, чтобы по прошествии долгого времени, происходила резкая смена цвета на несколько секунд, но если посмотрев фильм, до следующего цвета осталось несколько минут, то после следующего старта MPC-BE, эта смена произойдёт слишком рано, что не очень приятно и не имеет практического смысла. Можно ли, чтобы при каждом новом запуске плеера, цвета шли по очереди от самого первого?

29

Re: AHK: Заполнить монитор №1 чёрным цветом по горячей клавише

Именно по закрытию плеера, трудоёмко будет, а сбрасывать при новом показе можно.


#SingleInstance Force
#NoEnv

oTitles := ["ahk_class Notepad ahk_exe notepad.exe"
			, "ahk_class CalcFrame ahk_exe calc.exe"]

Global hGui, Show, Manual
, Effect := 0x00080000	; 0x00000010 - расширение, 0x00080000 - затухание, 0x00000001 - слева направо, 0x00000004 - сверху вниз
, EffectDuration := 333	; длительность эффекта

Gui, -DPIScale -Caption +AlwaysOnTop +HWNDhGui +Owner
Gui, Show,% "Hide x0 y0 w" A_ScreenWidth " h" A_ScreenHeight
OnMessage(0x201, "WM_LBUTTONDOWN")

Loop
{
	Sleep, 200
	If Manual
		Continue
	SysGet, MonitorCount, MonitorCount
	If (MonitorCount <> 2)
		Continue
	SysGet, MonitorPrimary, MonitorPrimary
	MonitorSecond := MonitorPrimary = 1 ? 2 : 1
	SysGet, Mon2, Monitor, %MonitorSecond%

	For i, Title in oTitles, HasSecond := 0
	{
		If !(hWnd := WinActive(Title))
			Continue
		WinGetPos, X, Y, , , % "ahk_id" hWnd
		If (X >= Mon2Left && X <= Mon2Right && Y >= Mon2Top && Y <= Mon2Bottom && (HasSecond := 1))
			Break
	}
	If (HasSecond && !Show)
		Show()
	Else If (!HasSecond && Show)
		Show(0)
}

Esc::  ExitApp

#If !Show
1:: Show(), Manual := 1
#If

Show(_Show = 1) { 
	If _Show
	{
		ChangeColor(0)
		DllCall("AnimateWindow", "Ptr", hGui, "Int", EffectDuration, "UInt", Effect)
		Gui, Show,% "NA x0 y0 w" A_ScreenWidth " h" A_ScreenHeight
		Gui, +AlwaysOnTop
	}
	Else
		DllCall("AnimateWindow", "Ptr", hGui, "Int", EffectDuration, "UInt", Effect|0x00010000)
	Show := _Show
}

ChangeColor(old = 1) {
	Static Colors := [["FF0000", 1], ["00FF00", 2], ["0000FF", 3]], i := 0
	If !old
		i := 0
 	Gui, Color, % Colors[i := ++i > Colors.MaxIndex() ? 1 : i][1]
	SetTimer, ChangeColor, % "-" . Colors[i][2] . "000"
}

WM_LBUTTONDOWN() {
	Show(0), Manual := 0
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

30

Re: AHK: Заполнить монитор №1 чёрным цветом по горячей клавише

serzh82saratov

Именно по закрытию плеера, трудоёмко будет, а сбрасывать при новом показе можно.

Спасибо большое Вам, такой вариант даже более подходит и логичнее.

P.S.
Если будет свободное время, может быть обратите внимание на вот эту задачу по Авто-Бэкапу файлов и папок?