Перемещение окна Opera на ТВ и обратно.

Обсуждение программ nnCron и nnCron LITE

Перемещение окна Opera на ТВ и обратно.

Postby POM80 » Sun, 09 Jun 2013, 14:55

Здравствуйте.
WinXP SP3 Pro + nncron.exe v 1.91 Build 1083 21.03.2006

Никак не получается сделать нормально работающий сабж (если окно не на весь экран на мониторе, то перемещается на ТВ 1 раз нормально, потом перестает разворачиватся, а если окно развернуто на весь экран на мониторе, то просто смещается и остается на мониторе).
В общем, просьба к гуру - проверьте код, может просто туплю...

Code: Select all
#( Opera_Move_TV
SingleInstance
AsLoggedUser
VARIABLE xo1
VARIABLE yo1
VARIABLE xo2
VARIABLE yo2
VARIABLE xm
VARIABLE ym
VARIABLE xt
VARIABLE yt
WatchHotKey: "${o}"
Rule: PROC-EXIST: "opera.exe"
Action:
/ разрешение монитора 1680x1050
1680 xm !
1050 ym !
/ разрешение телевизора 1360x768
1360 xt !
768 yt !
   WIN-EXIST: "*Opera*" IF
   WIN-ACTIVATE: "*Opera*"
   WIN-HWND WIN-RECT xo1 ! yo1 ! xo2 ! yo2 !
/ где находится окно (сравниваем координату X правого угла окна с шириной монитора)
   xo2 @ xm @ > IF
/ окно на ТВ
/ развернуто или свернуто (сравниваем площадь окна с площадью ТВ)
   yo2 @ yo1 @ - xo2 @ xo1 @ - * xt @ yt @ * = IF
/ развернуто
   WIN-ACTIVATE: "*Opera*"
   10 PAUSE
   WIN-RESTORE: "*Opera*"
THEN
/ перемещаем на монитор
   100 PAUSE
   10 10 WIN-MOVE
   10 PAUSE
   WIN-ACTIVATE: "*Opera*"
   100 PAUSE
   WIN-MAXIMIZE: "*Opera*"
ELSE
/ окно на мониторе
   yo2 @ yo1 @ - xo2 @ xo1 @ - * xm @ ym @ * = IF
   WIN-ACTIVATE: "*Opera*"
   10 PAUSE
   WIN-RESTORE: "*Opera*"
THEN
   100 PAUSE
   xm @ 10 + 10 WIN-MOVE
   10 PAUSE
   WIN-ACTIVATE: "*Opera*"
   10 PAUSE
   WIN-MAXIMIZE: "*Opera*"
THEN
THEN
   100 PAUSE
)#
User avatar
POM80
 
Posts: 12
Joined: Sun, 09 Jun 2013, 14:32

Re: Перемещение окна Opera на ТВ и обратно.

Postby elos » Mon, 10 Jun 2013, 16:44

Альтернатива для упрощения скрипта: http://www.nirsoft.net/utils/multi_monitor_tool.html
This utility works on any version of Windows, starting from Windows XP and up to Windows 8. Both 32-bit and x64 systems are supported.
This utility is only useful if your desktop is extended to multiple monitors. If you have multiple monitors that display the same content, then MultiMonitorTool is useless for you.
This command-line allows you to move windows from one monitor to the other, according to the specified conditions. You can also use this command-line option with /WindowLeft, /WindowTop, /WindowWidth, and /WindowHeight, in order to set the width/size of the moved window. (See examples below)
elos
 
Posts: 667
Joined: Tue, 25 Apr 2006, 11:15

Re: Перемещение окна Opera на ТВ и обратно.

Postby POM80 » Tue, 11 Jun 2013, 20:11

Спасибо за утилиту.
Изменил код, но все равно работает не все как надо.
Т.е. вот 4 варианта и получаемый результат:
1. Окно на мониторе развернуто на весь экран - мигает, но остается на мониторе.
2. Окно на мониторе не на весь экран - переносится на ТВ и разворачивается (все Ок).
3. Окно на ТВ развернуто на весь экран - переносится на монитор и разворачивается (все Ок).
4. Окно на ТВ не на весь экран - переносится на монитор и разворачивается (все Ок).

Не пойму в чем проблема в п. 1.

Code: Select all
#( Opera_Move_TV
SingleInstance
AsLoggedUser
VARIABLE x1
VARIABLE y1
VARIABLE x2
VARIABLE y2
VARIABLE xm
VARIABLE ym
VARIABLE xt
VARIABLE yt
WatchHotKey: "${o}"
Rule: PROC-EXIST: "opera.exe"
Action:
WIN-EXIST: "*Opera*" IF
/ разрешение монитора 1680x1050
1680 xm !
1050 ym !
/ разрешение телевизора 1360x768
1360 xt !
768 yt !
WIN-ACTIVATE: "*Opera*"
WIN-HWND WIN-RECT x1 ! y1 ! x2 ! y2 !
/ где находится окно (сравниваем координату X правого угла окна с шириной монитора)
x2 @ xm @ > IF
/ окно на ТВ - перемещаем на монитор
WIN-SEND-KEYS: "*Opera*" "{ESC}"
100 PAUSE
SWHide NormalPriority START-APP: c:\SysMy\MultiMonitorTool\MultiMonitorTool.exe /MoveWindow 1 Class "OperaWindowClass"
100 PAUSE
WIN-ACTIVATE: "*Opera*"
WIN-MAXIMIZE: "*Opera*"
1000 PAUSE
ELSE
/ окно на мониторе - перемещаем на ТВ
SWHide NormalPriority START-APP: c:\SysMy\MultiMonitorTool\MultiMonitorTool.exe /MoveWindow 2 Class "OperaWindowClass"
100 PAUSE
WIN-ACTIVATE: "*Opera*"
WIN-MAXIMIZE: "*Opera*"
WIN-SEND-KEYS: "*Opera*" "{F11}"
1000 PAUSE
THEN
THEN
)#
User avatar
POM80
 
Posts: 12
Joined: Sun, 09 Jun 2013, 14:32

Re: Перемещение окна Opera на ТВ и обратно.

Postby elos » Wed, 12 Jun 2013, 20:07

Ну, пункт первый, скорее всего связан с бОльшим разрешением монитора по сравнению с телевизором... Тут я проверять не хочу - у меня одинаковое разрешение 1920*1080 - и "дёргать" разрешение просто лень.

Код твой практически не проглядывал. Чем меньше вычислений и сравнений - тем лучше. Стало как-то тоскливо и в голове уже сидело решение...
Насколько я понимаю, неважно как, но по горячей клавише надо просто перекидывать Opera на другой экран (в полноэкранном режиме только на телевизоре).
Code: Select all
#( Opera_Move_TV
\ SingleInstance   \ а надо ли? кто ещё может вторую копию стартовать?
\ AsLoggedUser      \ не нужна, а то не получим токен пользователя...

\ чтобы не думать о разрешениях двух мониторов, будем запоминать их в переключателе
\ и просто перекидывать окно в другое устройство - оно само должно подстраиваться
\ определим монитор - 0, телевизор - 1 и будем добавлять единицу
\ у меня телевизор первый и мне надо в monitor единицу записывать
\ чтобы избежать первого "пустого" срабатывания

0 VALUE monitor   \ исходный стартовый стол (триггер)

WatchHotKey: "$o"
Rule: PROC-EXIST: "opera.exe"   \ в итоге не нужен WIN-EXIST:

Action:
1 monitor XOR TO monitor   \ переключаем триггер
  START-APP: c:\BIN\MultiMonitorTool.exe /MoveWindow "%monitor 1 +%" Class "OperaWindowClass"
\                                                    ^^^^^^^^^^^^^^^

 WIN-ACTIVATE: "*Opera"
 WIN-MAXIMIZE: "*Opera"
\ WIN-SEND-KEYS: "*Opera*" "{F11}"
)#

Не забываем - у меня прописаны другие пути утилиты. В логе видно переключение номера устройства вывода
19:56:12 1848 TASK: Opera_Move_TV
19:56:12 1848 Start: c:\BIN\MultiMonitorTool.exe /MoveWindow "1" Class "OperaWindowClass"
19:56:12 1848 Start result: 0
19:56:13 2452 TASK: Opera_Move_TV
19:56:13 2452 Start: c:\BIN\MultiMonitorTool.exe /MoveWindow "2" Class "OperaWindowClass"
19:56:13 2452 Start result: 0

И для пояснения работы триггера - нечетное количество единиц даёт единицу:
Code: Select all
 Ok
0 1 XOR .
1  Ok
1 1 XOR .
0  Ok
0 0 XOR .
0  Ok

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

Если выключить Opera и понажимать несколько раз hotkey, то визуально ничего не происходит - Opera то нет... В логах:
Code: Select all
21:08:27 3120 TASK: Opera_Move_TV
21:08:27 3120 Start: c:\BIN\MultiMonitorTool.exe /MoveWindow "2" Class "OperaWindowClass"
21:08:27 3120 Start result: 0
++++++ после выхода из Opera  сработка скрипта только один раз - возможно, процесс ещё не завершён был ++++++
21:09:08 3032 TASK: Opera_Move_TV
21:09:08 3032 Start: c:\BIN\MultiMonitorTool.exe /MoveWindow "1" Class "OperaWindowClass"
21:09:08 3032 Start result: 0
21:11:51 2804 TASK: word
21:11:51 2804 Start: C:\Program Files\Microsoft Office\Office14\WINWORD.EXE
21:11:51 2804 Start result: 0
elos
 
Posts: 667
Joined: Tue, 25 Apr 2006, 11:15

Re: Перемещение окна Opera на ТВ и обратно.

Postby POM80 » Wed, 12 Jun 2013, 22:49

Спасибо за помощь и ликбез!
Настроил под себя, все Ок.

Code: Select all
#( CLASSIC-TASK-#-Opera_Move_TV
SingleInstance   \ оставил, т.к. если быстро нажимать хоткей получается просто какое-то мигание окна, а так сколько не долби - все четко
0 VALUE mon_o
WatchHotKey: "${o}"
Rule: PROC-EXIST: "opera.exe"
Action:
1 mon_o XOR TO mon_o   \ переключаем триггер (спасибо, про такое не знал - слабовато с программированием)
WIN-ACTIVATE: "*Opera*"   \ тут пришлось добавить выход из полноэкранки, т.к. если опера в этом режиме, то окно не перемещается
WIN-SEND-KEYS: "*Opera*" "{ESC}"
100 PAUSE
SWHide START-APP: c:\SysMy\MultiMonitorTool\MultiMonitorTool.exe /MoveWindow "%mon_o 1 +%" Class "OperaWindowClass"
100 PAUSE
WIN-ACTIVATE: "*Opera*"
WIN-MAXIMIZE: "*Opera*"
)#


Ну а F11, если нужно, уже не лень тыкнуть.
А то мышкой таскать окно туда-сюда задолбало уже. :)

PS По аналогии сделаю еще для пары программ.
PPS Жаль что одним кроном не удалось справиться. По первому варианту у меня программа (видеоплеер) перемещалась, но там видимо окно более кошерное.
User avatar
POM80
 
Posts: 12
Joined: Sun, 09 Jun 2013, 14:32


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 2 guests

cron