1

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

Здравствуйте, использую два дисплея с разным разрешением в режиме расширения рабочего стола, и при просмотре кино на 2-ом, приходится вручную открывать чёрное изображение на 1-ом, т.к. у него плохо работает механическая кнопка отключения.

Так вот, хотелось бы автоматизировать это и добавить удобства, при нажатии хоткея, заливать 1-ый дисплей чёрным цветом, но если щёлкнуть по чёрному ЛКМ, когда нужно что-нибудь посмотреть, отключать заливку. Возможно это можно было бы реализовать так, чтобы заливка появлялась, только когда активен (т.е. последнее действием был щелчок ЛКМ по нему) mpc-be64.exe на 2-ом дисплее (можно добавить точные границы, за которыми идёт 2-ой монитор), чтобы когда просмотр идёт на 1-ом, не было заливки.

Подскажите пожалуйста, как можно это реализовать?

2

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

prog:="mpc-hc.exe"

Gui, Color, 000000
gui,-border +alwaysontop
gui,show,% "x-4 y-4 " "w" a_screenwidth+4 " h" a_screenheight+4
gui,hide

loop
{
  sleep,500
  if (winactive("ahk_exe " prog) and !doonce)
  {
    doonce=1
    gui,show,na
  }
  else if (doonce and !winactive("ahk_exe " prog))
  {
    doonce=
    gui,hide
    winactivate,ahk_exe explorer.exe
  }
}

esc::
exitapp
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

3

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

Alectric
Спасибо большое, работает идеально!

Единственное, возможно ли не затемнять, когда MPC находится на 1-ом мониторе в оконном или фуллскрин режиме? Как-нибудь детектировать, чтобы затемняло только, когда левый край MPC находится дальше 1680 пикселя, т.е. на 2-ом мониторе.

Объясню как пользуюсь, на MPC назначены жесты StrokesPlus - свайп влево перемещает окно на 1-ый монитор и закрывает, а свайп вправо, перемещает на 2-ой. Таким образом я часто использую его на основном дисплее, и удобно (а с Вашим скриптом вдвойне) перемещаю окно на ТВ.

4 (изменено: Alectric, 2016-03-15 20:14:08)

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

Используй WinGetPos чтобы определять координаты плеера, затем сравнивай их с положением на экране (если второй экран "слева" - используй только "X" и сравнивай по нулю, если "справа" - то относительно A_ScreenWeight, если экран снизу или сверху - то "Y").
Пробуй сам, если не получится помогу.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

5 (изменено: serzh82saratov, 2016-03-15 20:24:50)

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

Balux пишет:

левый край MPC находится дальше 1680 пикселя, т.е. на 2-ом мониторе

Это не факт, конечно зависит от настроек, но 2 монитор может быть где угодно.

Balux пишет:

перемещает окно на 1-ый монитор и закрывает

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


#SingleInstance Force
#NoEnv

Title := "ahk_exe mpc-hc.exe"  

Gui, Color, 000000
Gui, -DPIScale -Caption +AlwaysOnTop +E0x08000000
Gui, Show,% "Hide x0 y 0" "w" A_ScreenWidth " h" A_ScreenHeight  
 
Loop
{
	Sleep, 500
	If (!WinExist(Title)) 
	{ 
		If Show
		{
			Gui, Hide 
			Show := 0
		}
		Continue
	} 
	SysGet, Mon2, Monitor, 2
	If (Mon2Top = "")
		Continue 
	WinGetPos, X, Y 
	If (X >= Mon2Left && X <= Mon2Right && Y >= Mon2Top && Y <= Mon2Bottom) 
	{ 
		Gui, +AlwaysOnTop
		Gui, Show, Na
		Show := 1
	}
	Else If Show
	{ 
		Gui, Hide 
		Show := 0
	}
}  

Escape::  ExitApp
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

6

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

Alectric
Спасибо, но к сожалению не получается разобраться с AHK, хотя и понимаю принцип.

serzh82saratov

Это не факт, конечно зависит от настроек, но 2 монитор может быть где угодно.

У меня точно справа, хотя конечно иметь возможность подправить код под другое положение, удобно.

Да, наличие окна тоже надо определять, вдруг его просто закрыли на втором. Ещё окно накладку желательно делать неактивируемым, и периодически применять AlwaysOnTop, иначе некоторые окна могут всплыть поверх него, в первую очередь панель задач.

Код от уважаемого Alectric работает отлично и моментально выключает затемнение при закрытии MPC или смене фокуса, также ничего не всплывает поверх.

Ещё может быть удобным автоматически перемещать мышь на другой монитор.

Это да, но у меня этим заведует StrokesPlus, удобнейшая вещь для написания макросов.

serzh82saratov
Спасибо за код, но к сожалению он работает неправильно, если включить на 1-ом мониторе, то появляется затемнение, которое нельзя скрыть кликом, при перемещении MPC на 2-ой, затемнение исчезает, но в Fullscreen появляется. Левый монитор у меня 1680x1050, правый ТВ 1920x1080 и в Панели управления -> Разрешение экрана почему-то 1-ый дисплей имеет цифру 2, а 2-ой цифру 1. Может быть в этом причина, правда не скрываемое затемнение это проблема.

7 (изменено: Alectric, 2016-03-17 21:40:48)

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

Если плеер справа:

prog:="mpc-hc.exe"

Gui, Color, 000000
gui,-border +alwaysontop
gui,show,% "x-4 y-4 " "w" a_screenwidth+4 " h" a_screenheight+4
gui,hide

loop
{
  sleep,500
  WinGetPos,X,,,,% "ahk_exe " prog
  if (winactive("ahk_exe " prog) and !doonce and x>a_screenwidth-20)
  {
    doonce=1
    gui,show,na
  }
  else if (doonce and !winactive("ahk_exe " prog))
  {
    doonce=
    gui,hide
    winactivate,ahk_exe explorer.exe
  }
}

esc::
exitapp

Если слева:

  if (winactive("ahk_exe " prog) and !doonce and x<20)
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

8 (изменено: Balux, 2016-03-17 22:01:32)

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

Alectric
Спасибо огромное, действительно работает так, как нужно, сам бы я не додумался точно. Добавил немного кода serzh82saratov, чтобы у затемнения не было рамок и вообще отлично, за что спасибо.

И если не сложно, можно ли добавить горячую клавишу, которая затемняла бы даже без запущенного MPC, вне зависимости от чего-либо?

prog:="mpc-be64.exe"

Gui, Color, 000000
Gui, -DPIScale -Border -Caption +AlwaysOnTop 
Gui, Show,% "Hide x0 y 0" "w" A_ScreenWidth " h" A_ScreenHeight  
gui,hide

loop
{
  sleep,100
  WinGetPos,X,,,,% "ahk_exe " prog
  if (winactive("ahk_exe " prog) and !doonce and x>a_screenwidth-20)
  {
    doonce=1
    gui,show,na
  }
  else if (doonce and !winactive("ahk_exe " prog))
  {
    doonce=
    gui,hide
    winactivate,ahk_exe explorer.exe
  }
}

9 (изменено: Alectric, 2016-03-18 07:20:01)

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

Чет меня понесло...

prog:="mpc-be64.exe"
;prog:="mpc-hc.exe"

Gui, Color, 000000
Gui, -DPIScale -Border -Caption +AlwaysOnTop +hwndH
Gui, Show,% "Hide x0 y0 w" A_ScreenWidth " h" A_ScreenHeight

loop
{
  sleep,100
  WinGetPos,X,Y,,,% "ahk_exe " prog
  if !key
  {
    if (winactive("ahk_exe " prog) and !doonce and (x>a_screenwidth-100 or x<-20 or y>a_screenheight-100 or y<-20))
    {
      doonce=1
      WinSet,Transparent,1,Ahk_id %H%
      gui,show,na
      t=0
      settimer,fadeout,10
    }
    else if (doonce and (!winactive("ahk_exe " prog) or !(x>a_screenwidth-100 or x<-20 or y>a_screenheight-100 or y<-20)))
    {
      doonce=
      WinSet,Transparent,1,Ahk_id %H%`
      gui,hide
      winactivate,ahk_exe explorer.exe
    }
  }
  else
    Gui, +AlwaysOnTop
}
return

f1::
if key:=!key
{
  Gui,Show
  WinSet,Transparent,255,Ahk_id %H%`
}
else
{
  gui,hide
  winactivate,ahk_exe explorer.exe
}
return

fadeout:
t+=5
if t>255
{
  t=255
  settimer,fadeout,off
}
WinSet,Transparent,% t,Ahk_id %H%
return

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

10 (изменено: Balux, 2016-03-18 14:45:41)

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

Alectric
Спасибо большое, теперь ещё и с блэкдже... эффектами.



Если будет вдохновение, может быть ещё пару штук:

1) Сейчас нажав горячую клавишу без MPC, клик ЛКМ по затемнению не отключает его, было бы удобней как с MPC.

2) Сделать способ добавления других exe в дополнение к mpc-be64.exe, на которые будет авто-затемнение.

3) Во избежание выгорания, сделать постепенное (fadeout?) изменение цвета заливки раз в час (настраиваемо), например, на тёмно-синий 5 минут (настраиваемо) и обратно, с возможностью отключить это поведение.

11

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

Подскажите пожалуйста, как правильно добавлять другие программы (exe) в скрипт или его нужно переделывать?

Столбиком вот так, срабатывает только на 1-ый exe.


prog:="mpc-be64.exe
prog:="mpc-be.exe"
prog:="mpc-hc.exe"

12

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

Нужно переделывать, время будет покажу как.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

13

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

Alectric
Может быть, чтобы не переделывать, можно подставить знак замены, чтобы скрипт работал с 32-х и 64-х битной версией плеера?

prog:="mpc-be*.exe

14 (изменено: Alectric, 2016-03-30 22:09:42)

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

Как-то так, возможно есть ошибки, делал наспех:

progs=
(
mpc-be64.exe
mpc-hc.exe
notepad.exe
)

Gui, Color, 000000
Gui, -DPIScale -Border -Caption +AlwaysOnTop +hwndH
Gui, Show,% "Hide x0 y0 w" A_ScreenWidth " h" A_ScreenHeight

loop
{
  sleep,100

  check=
  loop,parse,progs,`n
  {
    active:=winactive("ahk_exe " a_loopfield)
    WinGetPos,X,Y,,,% "ahk_exe " a_loopfield
    coord:=(x>a_screenwidth-100 or x<-20 or y>a_screenheight-100 or y<-20)
    if (active and coord)
    {
      check=1
      break
    }
  }

  if !key
  {
    if (check and !doonce)
    {
      doonce=1
      WinSet,Transparent,1,Ahk_id %H%
      gui,show,na
      t=0
      settimer,fadeout,10
    }
    else if (doonce and !check)
    {
      doonce=
      WinSet,Transparent,1,Ahk_id %H%`
      gui,hide
      winactivate,ahk_exe explorer.exe
    }
  }
  else
    Gui, +AlwaysOnTop
}
return

f1::
if key:=!key
{
  Gui,Show
  WinSet,Transparent,255,Ahk_id %H%`
}
else
{
  gui,hide
  winactivate,ahk_exe explorer.exe
}
return

fadeout:
t+=5
if t>255
{
  t=255
  settimer,fadeout,off
}
WinSet,Transparent,% t,Ahk_id %H%
return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

15

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

Alectric
Спасибо большое, это то что нужно. Ошибок не замечено.

16

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

Alectric
К большому сожалению, проявилась ошибка, но не в Вашем крайнем изменении, а вообще. Когда MPC-BE находится на 1-ом мониторе, при клике по прогресс-бару появляется миллисекундное затемнение, как-будто мелькает экран, но что странно это затемнение бывает происходит и без клика, а при простом наведении мыши на плеер. А при попытке смены аудиодорожки, происходит полное затемнение, будто плеер на 2-ом мониторе.

В целом пользоваться конечно можно, но если Вы знаете в чём причина такого поведения, помогите пожалуйста. Т.к. MPC-BE находится на 1-ом (1680x1050) мониторе, совершенно непонятно почему скрипт реагирует на плеер.

17

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

У себя не могу повторить этой ошибки. У меня 1 монитор. Даже не знаю с чем связанно.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

18

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

Alectric
Видимо некие области MPC-BE, например прогресс бар, посылают сигнал, что они не mpc-be64.exe, причём даже без нажатия ЛКМ. Ну жить можно, жаль конечно, что в коде нельзя напрямую прописать, чтобы работал только за 1680 пикселем рабочего стола.

19 (изменено: serzh82saratov, 2016-04-05 05:19:24)

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

У плееров обычно много всяких окон, если смотреть координаты просто за пределами главного монитора, то можно принять например свёрнутое окно за искомое, так как у него координаты -32000 по х и у. Ну и в любом случае добавить в критерии ещё хотя бы класс окон.


#SingleInstance Force
#NoEnv

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

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

Gui, Color, % Color := 000000
Gui, -DPIScale -Caption +AlwaysOnTop +E0x08000000 +HWNDhGui
Gui, Show,% "Hide x0 y 0" "w" A_ScreenWidth " h" A_ScreenHeight
SetTimer, ChangeColor, 600000
OnMessage(0x201, "WM_LBUTTONDOWN")

Loop
{ 
	Sleep, 200
	If Off
		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
	{
		WinGet, Id, List, %Title%
		Loop, %Id%
		{ 
			WinGetPos, X, Y, , , % "ahk_id" Id%A_Index%
			If (X >= Mon2Left && X <= Mon2Right && Y >= Mon2Top && Y <= Mon2Bottom) 
			{
				HasSecond := 1
				Break 2
			} 
		}
	}
	If (HasSecond && !Show)
		Show()
	Else If (!HasSecond && Show)
		Show(0)
}

Escape::  ExitApp

1::
	Off := Show
	Show(!Off)
	Return

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

ChangeColor() {
 	Gui, Color, % Color := Color = 000000 ? 000011 : 000000
}

WM_LBUTTONDOWN() {
	Show(0), Off := 1
}

Этот вариант определяет номер монитора и его координаты, если монитор один, то ждёт появление второго, клик по окну скрывает его, есть несколько эффектов, периодическая смена цвета фона, работает с несколькими копиями одного плеера.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

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

serzh82saratov
Ого, спасибо большое, ещё и с продвинутыми эффектами , похоже проблема мельканий (затемнений) полностью устранена.

Но я так понял, в Вашем варианте нет авто-затемнения при возврате в фокус (ЛКМ по MPC-BE), как у Alectric, функция doonce помоему? Это очень удобно, что-то поделал на 1-ом мониторе, щёлкнул ЛКМ по фильму, пошло воспроизведение и 1-ый экран затемнился.

Ещё что странно, если щёлкнуть по затемнению, оно отключается, появляется значок AHK на панели задач, и при следующем запуске MPC-BE, затемнение уже не происходит, нужно вручную пепезагрузить скрипт, чтобы всё заработало. Это проблема на моей стороне?

21

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

Нет, это я так написал, ручное отключение как и по хоткею "выключить затемнение". Напишите развёрнуто всю логику, мало понятно желаемое в деталях.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

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

serzh82saratov
Я не знаю, возможно ли считывать логику с кода, но посмотрите пожалуйста вариант из 14 сообщения.

Опишу подробно, запускается плеер на 1-ом экране, если есть надобность смотреть на 2-ом, жестом плеер отправляется на 2-ой дисплей за 1680 пиксель, 1-ый затемняется. В процессе просмотра ставится на паузу видео, курсор возвращается на 1-ый экран, щёлкаем ЛКМ по затемнению, оно исчезает и дальше, что-то поделав в браузере, курсор возвращается на 2-ой дисплей, там на паузе в Fullscreen или в окне находится фильм, щёлкаем по нему ЛКМ (т.е. затемнение всегда, если MPC-BE в фокусе), продолжается воспроизведение и 1-ый монитор затемняется. После просмотра, плеер жестом отправляется на 1-ый дисплей и закрывается, затемнение исчезает.



Хотя основная функциональность в Вашем варианте работает отлично, опишу что не так:

1) После закрытия плеера, затемненение исчезает, но на панели задач остаётся иконка от GUI AHK. Перезагрузив вручную скрипт, она исчезает.

2) Если во время просмотра, щёлкнуть ЛКМ по затемнению, оно исчезнет, но вернув в фокус MPC-BE, уже не появляется. Более того, при следующем запуске плеера тоже, нужно перезагружать скрипт вручную, дабы он заработал.

3) В варианте Alectric, можно было по горячей клавише вызывать затемнение, даже если MPC-BE не запущен. В Вашем, при нажатии хоткея, затемнение появляется и мгновенно исчезает, видимо не обнаружив запущенного на 2-ом мониторе MPC-BE.

23

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

То есть затемнение может быть только если окно плеера активно и на втором мониторе? Я изначально понял, что просто если окно на втором мониторе находится.


#SingleInstance Force
#NoEnv

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

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

Gui, Color, % Color := 000000
Gui, -DPIScale -Caption +AlwaysOnTop +HWNDhGui +Owner
Gui, Show,% "Hide x0 y 0" "w" A_ScreenWidth " h" A_ScreenHeight
SetTimer, ChangeColor, 600000
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 y 0" "w" A_ScreenWidth " h" A_ScreenHeight
		Gui, +AlwaysOnTop
	}
	Show := _Show
}

ChangeColor() {
 	Gui, Color, % Color := Color = 000000 ? 000011 : 000000
}

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

на панели задач остаётся иконка от GUI AHK

У меня такого нет, от ОС может зависеть, добавил окну опцию, возможно поможет.

3) В варианте Alectric, можно было по горячей клавише вызывать затемнение, даже если MPC-BE не запущен.

По нажатию на хоткей появляется, по клику исчезает.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24 (изменено: Balux, 2016-04-06 11:42:22)

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

serzh82saratov

То есть затемнение может быть только если окно плеера активно и на втором мониторе?

Да, на практике это оказалось очень удобно.

У меня такого нет, от ОС может зависеть, добавил окну опцию, возможно поможет.

В Вашем новом варианте всё хорошо.

По нажатию на хоткей появляется, по клику исчезает.

Спасибо, так ещё удобней.



Спасибо большое за модификацию, вот теперь то, что надо. Не буду забегать вперёд, но пока всё работает отлично. Получилась отличная программа для связки монитор + ТВ.

А по поводу изменения цвета, это происходит с периодичностью 10 минут вот эти два цвета 000011 : 000000, 10 минут один и 10 минут другой?

ChangeColor() {
 	Gui, Color, % Color := Color = 000000 ? 000011 : 000000
}

25

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

Да,  цвета именно так меняются.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

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 Telegram: https://t.me/sergiol982
Win10x64 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 Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

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

serzh82saratov

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

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

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