Управление мышью

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

Управление мышью

Postby Morituruz » Wed, 24 Apr 2013, 14:49

Запуск произвольного кода через «постукивание» курсором мыши по границам экрана.

Code: Select all
<%
\ Жесты мышью
\ 14:36 02.04.2013
\ коэффициент («чувствительность»), определяющий размер квадрата угла. Чем он больше, тем большая область считается углом:
100 CONSTANT Screen_corner_factor
\ слова, возвращающие True, если курсор мыши находится в определённом месте:
: Mouse_in_bottom_left_corner? { \ x y mx my -- }
\ курсор мыши находится в нижнем левом углу экрана
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
y my - Screen_corner_factor <
mx Screen_corner_factor <
AND
;
: Mouse_in_bottom_right_corner? { \ x y mx my -- }
\ курсор мыши находится в нижнем правом углу экрана
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
y my - Screen_corner_factor <
x mx - Screen_corner_factor <
AND
;
: Mouse_in_top_left_corner? { \ x y mx my -- }
\ курсор мыши находится в верхнем левом углу
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
my Screen_corner_factor <
mx Screen_corner_factor <
AND
;
: Mouse_in_top_right_corner? { \ x y mx my -- }
\ курсор мыши находится в правом верхнем
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
my Screen_corner_factor <
x mx - Screen_corner_factor <
AND
;
: Mouse_in_top_third? { \ x y mx my -- }
\ мышь в средней трети верхней стороны экрана:
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
my 0=
mx x 3 / >
mx x 3 / 2 * <
AND AND
;
: Mouse_in_bottom_third? { \ x y mx my -- }
\ мышь в средней трети нижней стороны экрана:
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
my y 1 - =
mx x 3 / >
mx x 3 / 2 * <
AND AND
;
: Mouse_in_left_third? { \ x y mx my -- }
\ мышь в средней трети правой стороны экрана:
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
my y 3 / >
my y 3 / 2 * <
mx 0 =
AND AND
;
: Mouse_in_right_third? { \ x y mx my -- }
\ мышь в средней трети правой стороны экрана:
GetDesktopSize TO y TO x
MOUSE-POS TO my TO mx
my y 3 / > \ координата my больше трети верт. разрешения
my y 3 / 2 * < \ координата my меньше двух третей
mx x 1 - = \ координата x соответствует разрешению экрана минус пиксель
AND AND
;

\ для отсчёта времени:
USER mgd_gtc_buf
\ для хранения I внутри BEGIN AGAIN
USER mgd_i_buf
\ Сколько раз нужно махнуть мышкой в область для срабатывания + 1 на возврат из области. Т.е. для 3 касаний нужно 4:
4 CONSTANT mgd_contact_number
\ пауза между получением координат мыши:
50 CONSTANT mgd_wait
\ время в мс, в которое должно уложиться указанное количество касаний области:
1000 CONSTANT mgd_sensitivity
: mouse_gesture_and_action { a u a1 u1 -- }
\ на вход строка с названием слова для детекции движения
\ и строка с действием для этого события
BEGIN
   a u EVALUATE
   IF
      0 mgd_gtc_buf !
      mgd_contact_number 0 DO
         I mgd_i_buf !   \ для работы внутри цикла BEGIN... UNTIL
         GetTickCount \ кладём на стек время работы системы в мс
         BEGIN
            mgd_wait PAUSE
            a u EVALUATE   \ мышь должна покинуть область
            mgd_i_buf @ 2 MOD 0 <>
            =
         UNTIL
         \ прошедшее время сохраняем в переменную:
         GetTickCount SWAP - DUP mgd_sensitivity >
         IF
            mgd_gtc_buf !   \ убираем со стека в переменную, всё равно время уже превышено
            LEAVE
         ELSE
            mgd_gtc_buf @ + mgd_gtc_buf !
         THEN
      LOOP
      0 mgd_i_buf !
      mgd_gtc_buf @ mgd_sensitivity <
      IF
         a1 u1 EVALUATE
      THEN
      0 mgd_gtc_buf !
   THEN
   mgd_wait PAUSE
AGAIN
;

%>

\ делаем задачи на необходимые нам действия (у меня это управление winamp и сворачивание окна на переднем плане), не забудьте поставить свои действия:
#( mouse_gesture_detection_pause
NoLog SingleInstance NoActive Action:
S" Mouse_in_top_third?" S" 40046 Winamp_send_message" mouse_gesture_and_action
)#

#( mouse_gesture_detection_next
NoLog SingleInstance NoActive Action:
S" Mouse_in_right_third?" S" 40048 Winamp_send_message" mouse_gesture_and_action
)#

#( mouse_gesture_detection_previous
NoLog SingleInstance NoActive Action:
S" Mouse_in_left_third?" S" 40044 Winamp_send_message" mouse_gesture_and_action
)#

#( mouse_gesture_detection_show_notification
NoLog SingleInstance NoActive Action:
S" Mouse_in_bottom_third?" S" CLASSIC-TASK-#-winamp_show_notification LAUNCH" mouse_gesture_and_action
)#

#( mouse_gesture_detection_volume_up
NoLog SingleInstance NoActive Action:
S" Mouse_in_top_right_corner?" S" get_winamp_volume 10 + 255 MIN set_winamp_volume" mouse_gesture_and_action
)#

#( mouse_gesture_detection_volume_down
NoLog SingleInstance NoActive Action:
S" Mouse_in_bottom_right_corner?" S" get_winamp_volume 10 - 0 MAX set_winamp_volume" mouse_gesture_and_action
)#

#( mouse_gesture_detection_minimize
NoLog SingleInstance NoActive Action:
S" Mouse_in_bottom_left_corner?" S" GetForegroundWindow N>S WIN-MINIMIZE" mouse_gesture_and_action
)#



Добавляем запуск задач в конец кронтаба, чтобы алгоритм заработал сразу после перечитывания:
Code: Select all
<%
mouse_gesture_detection_pause LAUNCH
mouse_gesture_detection_next LAUNCH
mouse_gesture_detection_previous LAUNCH
mouse_gesture_detection_show_notification LAUNCH
mouse_gesture_detection_volume_up LAUNCH
mouse_gesture_detection_volume_down LAUNCH
mouse_gesture_detection_minimize LAUNCH
%>


Для чего например это нужно: при работе в полноэкранном терминале (WTS) все горячие клавиши отсылаются на терминал, поэтому другого способа отослать команду в nncron на родном компьютере нет.
Есть ещё такой костыль: зелёная полосочка у верхнего края. Она всегда поверх терминального окна. Кликнув на неё, получаем фокус в родной системе:
Code: Select all
#( rdp_hint
NoLog
WatchHotKey: "@(^(h))"
Action:
xRes 3 / 0 HINT-POS
xRes 3 / 4 HINT-SIZE
0x00FF00 0x000000 HINT-COLOR
HINT: "."
)#
Last edited by Morituruz on Thu, 25 Apr 2013, 13:08, edited 1 time in total.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Управление мышью

Postby AlikasS » Thu, 25 Apr 2013, 08:33

немного не понял. расшифруй
где в этих случая должна быть мышь и сколько раз ей махать и как (по расстоянию)?
Code: Select all
: Mouse_in_bottom_left_corner? { \ x y mx my -- }
: Mouse_in_bottom_right_corner? { \ x y mx my -- }
: Mouse_in_top_left_corner? { \ x y mx my -- }
: Mouse_in_top_right_corner? { \ x y mx my -- }
: Mouse_in_top_third? { \ x y mx my -- } \ мышь в средней трети верхней стороны экрана:
: Mouse_in_bottom_third? { \ x y mx my -- } \ мышь в средней трети нижней стороны экрана:
: Mouse_in_left_third? { \ x y mx my -- } \ мышь в средней трети правой стороны экрана:
: Mouse_in_right_third? { \ x y mx my -- } \ мышь в средней трети правой стороны экрана:
User avatar
AlikasS
 
Posts: 1437
Joined: Wed, 28 Jun 2006, 05:39
Location: Khabarovsk

Re: Управление мышью

Postby SeMa » Thu, 25 Apr 2013, 13:00

Иногда срабатывает на 1й жест -> <-, иногда на 2й, иногда на начало 3-го. Да и с углами как-то непонятно. Редко срабатывает от движения "в угол", чаще при горизонтальном перемещении в районе угла.
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Управление мышью

Postby Morituruz » Thu, 25 Apr 2013, 13:14

AlikasS wrote:где в этих случая должна быть мышь и сколько раз ей махать и как (по расстоянию)?

Добавил описание к этим словам.
То, столько раз махать, регулируется константой mgd_contact_number, оно одно для всех слов. Описание к другим константам тоже есть.
«Махать» это не совсем правильный термин, правильнее будет «постучать». Т.е. например подвести мышку к верхнему краю экрана (координата Y курсора мыши = 0), потом отвести, потом снова подвести. Чувствительность срабатывания регулируется константами.
SeMa wrote:Иногда срабатывает на 1й жест -> <-, иногда на 2й, иногда на начало 3-го. Да и с углами как-то непонятно. Редко срабатывает от движения "в угол", чаще при горизонтальном перемещении в районе угла.

Вам наверное следует подобрать константы под себя.

В примере из первого поста, для срабатывания кода нужно 3 раза коснуться заданной области. т.е. например 3 раза коснуться курсором левого нижнего угла (т.е. туда-сюда курсором в угол), чтобы окно на переднем плане свернулось.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Управление мышью

Postby SeMa » Thu, 25 Apr 2013, 14:49

По наклонной в угол срабатывает значительно реже, чем по горизонтали. По вертикали вообще ни разу не удалось.
Ещё. Заданные события отрабатываются. Но..
Для тестирования я вместо конкретных команд ввёл вывод сообщений. Т.к. это строка в строке, то пришлось реализовать через плагин автострок (последний), иначе текст сообщения ввести не удастся.
Code: Select all
#( mouse_gesture_detection_volume_down
NoLog SingleInstance NoActive
Action:
S" Mouse_in_bottom_right_corner?" " S\q Bottom Right Corner\q 3 THINT" mouse_gesture_and_action
)#

Столкнулся с тем, что сообщение выводится только первый раз на соответствующий жест. Дальше реакции на этот жест нет.
Если команда для вывода текста определена через новое слово, например:
Code: Select all
#( mouse_gesture_detection_previous
NoLog SingleInstance NoActive
: LEFT-THINT S" LEFT" 3 THINT ;
Action:
S" Mouse_in_left_third?" S" LEFT-THINT" mouse_gesture_and_action
)#

то всё работает прекрасно.
Но, по-моему, это проблема в реализации строк.
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Управление мышью

Postby Morituruz » Thu, 25 Apr 2013, 15:21

SeMa wrote:По наклонной в угол срабатывает значительно реже, чем по горизонтали. По вертикали вообще ни разу не удалось.

Даже и не знаю, точно за область квадрата угла мышь выходит?

SeMa wrote:Столкнулся с тем, что сообщение выводится только первый раз на соответствующий жест. Дальше реакции на этот жест нет.

Я попробовал в таком виде:
Code: Select all
#( mouse_gesture_detection_tst
NoLog SingleInstance NoActive
Action:
S" Mouse_in_top_left_corner?" S" S%QUOTE% TEST%QUOTE% HINT" EVAL-SUBST mouse_gesture_and_action
)#

и тоже после первого раза не работает. Видимо какая-то особенность HINT.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Управление мышью

Postby SeMa » Thu, 25 Apr 2013, 15:30

Moriturus wrote:Даже и не знаю, точно за область квадрата угла мышь выходит?

Да.

Moriturus wrote:и тоже после первого раза не работает. Видимо какая-то особенность HINT.

С MsgBox то же.
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 1 guest