Адекватная замена SlyControl

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

Postby Ilya » Tue, 14 Nov 2006, 23:35

Обновлённый плагин. Используем слово WatchAVer

Code: Select all
\ Плагин для AVer TV
WINAPI: AVER_HWInit            averapi.DLL
WINAPI: AVER_GetRemoteData      averapi.DLL
WINAPI: CoInitialize  OLE32.DLL
WINAPI: CoUninitialize  OLE32.DLL
VARIABLE aver_code      \ Переменная в которой код от пульта
VARIABLE aver_task
500 VALUE aver_pause   \ Пауза в цикле опроса (в мсек)
0 VALUE aver_event   \
\ Используем слово WatchAVer


: _watchaver
Event DUP TO aver_event
;

: WatchAVer
   POSTPONE WATCH:
   POSTPONE _watchaver

    POSTPONE END-WATCH
; IMMEDIATE


:NONAME
BEGIN
aver_code AVER_GetRemoteData DROP
@ IF aver_event SetEvent DROP THEN
aver_pause PAUSE
AGAIN
; TASK: AVER

: _aver_init
0 CoInitialize DROP
AVER_HWInit DROP
;

: _aver_destr
CoUninitialize DROP
;


WARNING @ WARNING 0!
: AfterCrontabLoading
_aver_init
0 AVER START aver_task !
 AfterCrontabLoading
 ;
 
 : BeforeStop
 aver_task @ STOP
 _aver_destr
 BeforeStop ;
 
 WARNING !

и табе так:
Code: Select all
#( av
WatchAVer
Action:
aver_code @ N>S buf ZPLACE  buf ASCIIZ> 1 TimeMsgBox
)#

Насколько правильно сделал WatchAvr незная ?
Но вроде работает, но нужна "опытная эксплуатация" :lol:
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Postby Dark_Jones » Wed, 15 Nov 2006, 00:15

Ilya wrote:Обновлённый плагин. Используем слово WatchAVer
Насколько правильно сделал WatchAvr незная ?
Но вроде работает, но нужна "опытная эксплуатация" :lol:


Удобнее стало. Опрос каждые 500мс? Быстрое нажатие пропускает: 100 мс - самое то (200 - тоже бываю пропуски). Размер крона 500 Кб в ожидании и 1,6 Мб во время перехвата команд пульта, ресурс 1-2%. Ну что ж, в принципе, не знаю даже чего ещё желать в этом топике. СПАСИБО!
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby Dark_Jones » Wed, 15 Nov 2006, 00:49

Есть вопрос оффтопичный - зачем нужен массив buf? Почему нельзя вывести сразу "%aver_code @ N>S%"?
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby Ilya » Wed, 15 Nov 2006, 01:35

Dark_Jones wrote:Есть вопрос оффтопичный - зачем нужен массив buf? Почему нельзя вывести сразу "%aver_code @ N>S%"?

Да просто так привык. :)
Ilya
 
Posts: 443
Joined: Mon, 07 Aug 2006, 09:51
Location: Санкт-Петербург

Postby Dark_Jones » Wed, 15 Nov 2006, 23:28

В принципе простенькие задачи работают.
OSD, правда, как-то странно перерисовывает экран - все ярлычки мерцают в такт (в Опере незаметно, а вот в Тотале и на рабочем столе очень даже...).

Сделал так:
Code: Select all
#( Mute
WatchHotKey: "{VOLUME_MUTE}"
Action:
MIXER-STATE
IF
  MIXER-MUTE
  OSD: "                  " 100
  OSD-FONT: "Arial" 50 0x00FF0000
  OSD: "Звук ВЫКЛЮЧЕН (%MIXER-VOLUME@%)%%" 2000
  PAUSE: 3000
ELSE
  MIXER-UNMUTE
  OSD: "                 " 100
  OSD: "Звук ВКЛЮЧЕН %MIXER-VOLUME@%%%" 2000
  PAUSE: 3000
THEN
)#

#( VolDown
WatchHotKey: "{VOLUME_DOWN}"
Action:
1 MIXER-DOWN
OSD: "              " 100
OSD: "Громкость %MIXER-VOLUME@%%%" 2000
PAUSE: 200
)#

#( VolUp
WatchHotKey: "{VOLUME_UP}"
Action:
1 MIXER-UP
OSD: "              " 100
OSD: "Громкость %MIXER-VOLUME@%%%" 2000
PAUSE: 200
)#

#( PlayPause
AsLoggedUser
LoadProfile
WatchHotKey: "{MEDIA_PLAY_PAUSE}"
Action:
PROC-EXIST: "winamp.exe" NOT FILE-EXIST: "C:\Program Files\Winamp\winamp.exe" AND
IF
  StartIn: "C:\Program Files\Winamp" ShowMinimized NormalPriority START-APP: C:\Program Files\Winamp\winamp.exe
  PROC-ID PROC-WAIT-IDLE
  PAUSE: 500
  StartIn: "C:\Program Files\Winamp" ShowMinimized NormalPriority START-APP: C:\Program Files\Winamp\winamp.exe
  PROC-ID PROC-WAIT-IDLE
  PAUSE: 500
THEN
PROC-EXIST: "winamp.exe"
IF
  WINAMP-PLAY
THEN
)#

#( RemoteAver
AsLoggedUser
LoadProfile
WatchAVer
Action:
aver_code @
CASE
    122 OF VolDown RUN ENDOF
    250 OF VolUp RUN ENDOF
    42 OF Mute RUN PAUSE: 1000 ENDOF
    18 OF PlayPause RUN ENDOF
    2 OF SEND-KEYS: "@{F4}" PAUSE: 1000 ENDOF
ENDCASE
)#


Но вот винамп запускается, но не играет почему-то. Кто-нибудь может помочь? В nncron.out такое появляется при запуске "PlayPause":

22925 22925 23580 23580 23580 22925 22270 22270 22270 21615 21615 20960 20960 20305 19650 19650 19650 18995 18995 18340 18340 17685 17030 17030 17030 16375 16375 15720 15720 15065 14410 14410 14410 13755 13755 13100 13100 12445 12445 11790 11790 11135 11135 10480 9825 9825 9825 9170
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby MasterW » Thu, 04 Jan 2007, 16:35

Парни, а как этот процесс\программу совместить с quicktv. Нет же такого слова типа запускать если процесс ( avertv.exe ) не запущен?
ВСЁ БУДЕТ ... И ДЕНЬГИ
MasterW
 
Posts: 52
Joined: Sat, 10 Jun 2006, 16:07
Location: RND

Postby Dark_Jones » Thu, 04 Jan 2007, 18:55

MasterW wrote:Парни, а как этот процесс\программу совместить с quicktv. Нет же такого слова типа запускать если процесс ( avertv.exe ) не запущен?

quicktv надо просто прибить и больше не запускать. обрабатывать полностью в кроне.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby MasterW » Fri, 05 Jan 2007, 20:41

Dark_Jones, дружище, обьясни принцип работы, и gkc? скинь все свои задачи.
ps: Неужели надо все кнопки с пульта под avertv переделывать?
ВСЁ БУДЕТ ... И ДЕНЬГИ
MasterW
 
Posts: 52
Joined: Sat, 10 Jun 2006, 16:07
Location: RND

Postby Dark_Jones » Fri, 05 Jan 2007, 23:05

MasterW wrote:Dark_Jones, дружище, обьясни принцип работы, и gkc? скинь все свои задачи.
ps: Неужели надо все кнопки с пульта под avertv переделывать?


Принцип вверху написан. :-)
Кнопки надо переделывать ;-(
Задачу скину, но это - сырая штука. Железобетонная... Просто чтобы сейчас "хоть как-то" работала...

Code: Select all
#( Mute
NoLog
WatchHotKey: "{VOLUME_MUTE}"
Action:
MIXER-STATE
IF
  MIXER-MUTE
  OSD-CLEAR
  OSD-FONT: "Arial" 50 0x00FF0000
  OSD: "Звук ВЫКЛЮЧЕН (%MIXER-VOLUME@ N>S%%PERCENT%)" 2000
  PAUSE: 3000
ELSE
  MIXER-UNMUTE
  OSD-CLEAR
  OSD: "Звук ВКЛЮЧЕН %MIXER-VOLUME@ N>S%%PERCENT%" 2000
  PAUSE: 3000
THEN
)#

#( VolDown
NoLog
WatchHotKey: "{VOLUME_DOWN}"
Action:
1 MIXER-DOWN
OSD-CLEAR
MIXER-STATE NOT
IF
  OSD-FONT: "Arial" 50 0x00FF0000
THEN
OSD: "Громкость %MIXER-VOLUME@ N>S%%PERCENT%" 2000
PAUSE: 200
)#

#( VolUp
NoLog
WatchHotKey: "{VOLUME_UP}"
Action:
1 MIXER-UP
OSD-CLEAR
MIXER-STATE NOT
IF
  OSD-FONT: "Arial" 50 0x00FF0000
THEN
OSD: "Громкость %MIXER-VOLUME@ N>S%%PERCENT%" 2000
PAUSE: 200
)#

#( PlayPause
NoLog
AsLoggedUser
LoadProfile
WatchHotKey: "{MEDIA_PLAY_PAUSE}"
Action:
PROC-EXIST: "winamp.exe" NOT FILE-EXIST: "C:\Program Files\Winamp\winamp.exe" AND
IF
  StartIn: "C:\Program Files\Winamp" ShowMinimized NormalPriority START-APP: "C:\Program Files\Winamp\winamp.exe"
  PROC-ID PROC-WAIT-IDLE
  PAUSE: 500
THEN
PROC-EXIST: "winamp.exe"
IF
  SEND-KEYS: "@(^{INSERT})"
THEN
)#

#( WinAmp_NP
AsLoggedUser
LoadProfile
NoLog
WatchFile: "C:\Program Files\nnCron\winamp.txt"
Action:
OSD-CLEAR
OSD: "%FILE: C:\Program Files\nnCron\winamp.txt%" 2500
)#

#( RemoteAver
AsLoggedUser
LoadProfile
WatchAVer
Action:
aver_code @
CASE
    250 OF VolUp RUN ENDOF
    218 OF
          PROC-EXIST: "winamp.exe"
          IF
             SEND-KEYS: "{MEDIA_STOP}"
          ELSE
            PROC-EXIST: "Sasami2000.exe"
            IF
              SEND-KEYS: "{ESC}"
            ELSE
              PROC-EXIST: "bsplayer.exe"
              IF
                SEND-KEYS: "v"
              THEN
            THEN
          THEN
        ENDOF
    195 OF
          PROC-EXIST: "winamp.exe"
          IF
            SEND-KEYS: "@(^{PGDN}){DELAY 2500}"
          ELSE
            PROC-EXIST: "AVerTV.exe"
            IF
              SEND-KEYS: "{RIGHT}{DELAY 2500}"
            ELSE
              PROC-EXIST: "Sasami2000.exe" PROC-EXIST: "bsplayer.exe" OR PROC-EXIST: "ACDSee5.exe" OR
              IF
                SEND-KEYS: "{PGDN}{DELAY 2500}"
              THEN
            THEN
          THEN
          PAUSE: 2500
        ENDOF
    131 OF
          PROC-EXIST: "winamp.exe"
          IF
            SEND-KEYS: "@(^{LEFT})"
          ELSE
            PROC-EXIST: "Sasami2000.exe" PROC-EXIST: "bsplayer.exe" OR
            IF
              SEND-KEYS: "{LEFT}"
            THEN
          THEN
        ENDOF
    130 OF
          PROC-EXIST: "AVerTV.exe" NOT FILE-EXIST: "C:\Program Files\AVerTV\AVerTV.exe" AND
          IF
            StartIn: "C:\Program Files\AVerTV" START-APP: "C:\Program Files\AVerTV\AVerTV.exe"
            PROC-ID PROC-WAIT-IDLE
            PAUSE: 350
          THEN
        ENDOF
    122 OF VolDown RUN ENDOF
    90 OF
          PROC-EXIST: "winamp.exe"
          IF
             SEND-KEYS: "^(@{HOME})"
          ELSE
            PROC-EXIST: "Sasami2000.exe"
            IF
              SEND-KEYS: " "
            ELSE
              PROC-EXIST: "bsplayer.exe"
              IF
                SEND-KEYS: "c"
              THEN
            THEN
          THEN
        ENDOF
    67 OF
          PROC-EXIST: "winamp.exe"
          IF
            SEND-KEYS: "@(^{PGUP}){DELAY 2500}"
          ELSE
            PROC-EXIST: "AVerTV.exe"
            IF
              SEND-KEYS: "{LEFT}{DELAY 2500}"
            ELSE
              PROC-EXIST: "Sasami2000.exe" PROC-EXIST: "bsplayer.exe" OR PROC-EXIST: "ACDSee5.exe" OR
              IF
                SEND-KEYS: "{PGUP}{DELAY 2500}"
              THEN
            THEN
          THEN
          PAUSE: 2500
        ENDOF
    50 OF
         PROC-EXIST: "Sasami2000.exe"
         IF
           SEND-KEYS: "@({ENTER})"
         ELSE
           PROC-EXIST: "bsplayer.exe"
           IF
             SEND-KEYS: "f"
           ELSE
             PROC-EXIST: "ACDSee5.exe"
             IF
               SEND-KEYS: "{ENTER}"
             THEN
           THEN
         THEN
         PAUSE: 1500
       ENDOF
    42 OF Mute RUN PAUSE: 1500 ENDOF
    34 OF
         PROC-EXIST: "Sasami2000.exe" NOT FILE-EXIST: "C:\Program Files\Sasami2k\Sasami2000.exe" AND
         IF
           OSD-CLEAR
           OSD: "Sasami 2000" 2500
           StartIn: "C:\Program Files\Sasami2k" ShowNormal NormalPriority START-APP: "C:\Program Files\Sasami2k\Sasami2000.exe"
           PROC-ID PROC-WAIT-IDLE
           PAUSE: 500
         THEN
       ENDOF
    26 OF
         PROC-EXIST: "winamp.exe"
         IF
           SEND-KEYS: "@(^x)"
         ELSE
           PROC-EXIST: "Sasami2000.exe"
           IF
             SEND-KEYS: " "
           ELSE
             PROC-EXIST: "bsplayer.exe"
             IF
               SEND-KEYS: "x"
             THEN
           THEN
         THEN
       ENDOF
    18 OF PlayPause RUN ENDOF
    3 OF
          PROC-EXIST: "winamp.exe"
          IF
            SEND-KEYS: "@(^{RIGHT})"
          ELSE
            PROC-EXIST: "Sasami2000.exe" PROC-EXIST: "bsplayer.exe" OR
            IF
              SEND-KEYS: "{RIGHT}"
            THEN
          THEN
        ENDOF
    2 OF SEND-KEYS: "@{F4}" PAUSE: 1000 ENDOF
ENDCASE
)#


Основное назначение - управление винампом. Как к АверТВ привязать - не знаю (моя версия не умеет горячие клавиши). Новый софт от авера - умеет, но его на 307 тюнер надо "крякать". Пока решение видиться - отслеживать запуск АверТВ.ехе и запускать quiktv.exe, а потом выгружать.
Сейчас задачу переписываю - хочется делать выбор приложений, управлять курсором мышки, и иметь более простую настройку. :D
Плюс ещё неизвестно какие коды твой пульт выдаёт... Может от моих отличаются...
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby Dark_Jones » Sun, 07 Jan 2007, 01:11

Вот ещё вариант. Более простая настройка программ.

Code: Select all
#( RemoteAver
AsLoggedUser
LoadProfile
WatchAVer
VARIABLE code-file
VARIABLE key-file
CREATE list-cont 258 ALLOT
CREATE list-key 258 ALLOT
CREATE key_code 32 ALLOT
CREATE appl_path 70 ALLOT
Action:
S" C:\Program Files\nnCron\plugins\Aver\" appl_path PLACE
PROC-EXIST: "winamp.exe"
IF
  S" AppWinamp.txt" appl_path +PLACE
ELSE
  PROC-EXIST: "AVerTV.exe"
  IF
    S" AppAverTV.txt" appl_path +PLACE
  ELSE
    PROC-EXIST: "Sasami2000.exe"
    IF
      S" AppSasami.txt" appl_path +PLACE
    ELSE
      PROC-EXIST: "bsplayer.exe"
      IF
        S" AppBSPlayer.txt" appl_path +PLACE
      ELSE
        PROC-EXIST: "ACDSee5.exe"
        IF
          S" AppACDSee.txt" appl_path +PLACE
        THEN
      THEN   
    THEN
  THEN
THEN
aver_code @
CASE
    250 OF VolUp RUN ENDOF
    130 OF
          PROC-EXIST: "AVerTV.exe" NOT FILE-EXIST: "C:\Program Files\AVerTV\AVerTV.exe" AND
          IF
            StartIn: "C:\Program Files\AVerTV" START-APP: "C:\Program Files\AVerTV\AVerTV.exe"
            PROC-ID PROC-WAIT-IDLE
            PAUSE: 350
          THEN
        ENDOF
    122 OF VolDown RUN ENDOF
    42  OF Mute RUN PAUSE: 1500 ENDOF
    34  OF
         PROC-EXIST: "Sasami2000.exe" NOT FILE-EXIST: "C:\Program Files\Sasami2k\Sasami2000.exe" AND
         IF
           OSD-CLEAR
           OSD: "Sasami 2000" 2500
           StartIn: "C:\Program Files\Sasami2k" ShowNormal NormalPriority START-APP: "C:\Program Files\Sasami2k\Sasami2000.exe"
           PROC-ID PROC-WAIT-IDLE
           PAUSE: 500
         THEN
       ENDOF
    18  OF PlayPause RUN ENDOF
    2   OF SEND-KEYS: "@{F4}" PAUSE: 1000 ENDOF
    DUP OF
          S" %appl_path COUNT%" EVAL-SUBST S" C:\Program Files\nnCron\plugins\Aver\" COMPARE 0= NOT
          IF
            S" C:\Program Files\nnCron\plugins\Aver\CodAver.txt" R/O OPEN-FILE-SHARED THROW code-file !
            S" %appl_path COUNT%" EVAL-SUBST R/O OPEN-FILE-SHARED THROW key-file !
            BEGIN
                 list-key 1+ 255 key-file @ READ-LINE THROW DROP
                 list-cont 1+ 255 code-file @ READ-LINE THROW
            WHILE
                 list-cont C!
                 list-key C!
                 S" %list-cont COUNT%" EVAL-SUBST S>NUM aver_code @ =
                 IF
                   S" %list-key COUNT%" EVAL-SUBST key_code PLACE
                 THEN
            REPEAT
            DROP
            DROP
            code-file @ CLOSE-FILE DROP
            key-file @ CLOSE-FILE DROP
            S" %key_code COUNT%" EVAL-SUBST S" -" COMPARE 0= NOT
            IF
              SEND-KEYS: "%key_code COUNT%"
            THEN
          THEN
        ENDOF
ENDCASE
)#


Вот по этому пути C:\Program Files\nnCron\PLUGINS\Aver\ находятся файлы типа AppWinamp.txt с содержимым:
Code: Select all
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
$(^(@s))
-
-
-
-
^(@{HOME})
{MEDIA_STOP}
@(^x)
-
-
-
-
@(^{LEFT})
@(^{PGUP}){DELAY 2100}
@(^{PGDN}){DELAY 2100}
@(^{RIGHT})


и файл CodAver.txt, созданный программой averforth.exe (нажимал на пульте кнопки слева-направо сверху-вниз):
Code: Select all
130
66
194
2
162
98
226
34
146
82
210
18
178
114
242
50
138
74
202
10
170
106
234
42
154
90
218
26
186
122
250
58
131
67
195
3


Всё очень просто - при нажатии кнопки на пульте читаем построчно файл CodAver.txt и App*.txt до совпадения кодов пульта с кодом в CodAver при этом из файла App* берём строку, которая является горячей клавишей.
Ещё хочу сделать также ручной перебор управляемых приложений и включение эмуляции мыши/клавы (пока реализован атоматический) в секции между Action и aver_code.

Есть проблемы:
- кушает ресурсы при чтении файлов до 30%.
- надо бы выйти из цикла чтения после совпадения кодов, но как? (создать новое слово + EXIT - не умею, да может есть и лучше вариант?).
- DUP OF срабатывает даже после совпадения с одним из предыдущих значений. Проверял с помощью MSG:. Как пофиксить? (ставить EXIT перед каждым ENDOF - некрасиво).
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby Dark_Jones » Sun, 07 Jan 2007, 01:17

Как сделать такую вещь (см. ниже)?
Читаем строку из файла и в зависимости от неё проводим разные подзадачи:

@(^{RIGHT}) - посылаем в SEND-KEYS (это сделано);
~0 40045 273 - посылаем SendMessage (как проверить, что первый символ ~?).
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby MasterW » Tue, 04 Sep 2007, 16:12

Вот мои простые наработки)) Выключение компа через нижнюю левую кнопку

При запуске avertv запускается QuickTV.exe, и задача aver становится не активна. При закрытии avertv - наоборот( активна и QuickTV.exe выгружается)
Code: Select all
#( Aver
AsLoggedUser
LoadProfile
WatchAVer
Action:
aver_code @
CASE
   130 OF START-APP: C:\Program Files\AVerTV\AVerTV.exe ENDOF
   131 OF TQUERY: "Выключить компьютер?" 10 Yes
         IF
         POWEROFF
         THEN ENDOF
   122 OF -громкость RUN ENDOF
   250 OF +громкость RUN ENDOF
   42 OF Mute RUN ENDOF
   ENDCASE
)#

###########################################################

#( Kill_QuickTV
WatchProcStop: "AverTV.exe"
Action:
   KILL: "QuickTV.exe"
   Aver @ CF-ACTIVE SET-CRON-FLAG
)#

###########################################################

#( Run_QuickTV
WatchProc: "AverTV.exe"
Action:
   START-APP: C:\Program Files\AVerTV\QuickTV.exe 
   CUR-NODE CF-ACTIVE SET-CRON-FLAG
)#

###########################################################

# Общая громкость

#( -громкость
WatchHotKey: "{0x6D}"
Action:
5 MIXER-DOWN
MIXER-STATE 0=
IF
   BALLOON: "Уровень громкости" "Звук ВЫКЛЮЧЕН (%MIXER-VOLUME@%)"
   PAUSE: 700
   BALLOON: "" ""
ELSE
   
   BALLOON: "Уровень громкости" "Звук %MIXER-VOLUME@%"
   PAUSE: 700
   BALLOON: "" ""
THEN
)#

#( +громкость
WatchHotKey: "{0x6B}"
Action:
5 MIXER-UP
MIXER-STATE 0=
IF
   BALLOON: "Уровень громкости" "Звук ВЫКЛЮЧЕН (%MIXER-VOLUME@%)"
   PAUSE: 700
   BALLOON: "" ""
ELSE
   
   BALLOON: "Уровень громкости" "Звук %MIXER-VOLUME@%"
   PAUSE: 700
   BALLOON: "" ""
THEN
)#

#( Mute
WatchHotKey: "{MULTIPLY}"
Action:
MIXER-STATE 0=
IF
   MIXER-UNMUTE
   BALLOON: "Уровень громкости" "Звук %MIXER-VOLUME@%"
   PAUSE: 700
   BALLOON: "" ""
ELSE
   MIXER-MUTE
   BALLOON: "Уровень громкости" "Звук ВЫКЛЮЧЕН (%MIXER-VOLUME@%)"
   PAUSE: 700
   BALLOON: "" ""
THEN
)#
ВСЁ БУДЕТ ... И ДЕНЬГИ
MasterW
 
Posts: 52
Joined: Sat, 10 Jun 2006, 16:07
Location: RND

Postby Dark_Jones » Sat, 20 Oct 2007, 12:44

Написал скрипт, который делает всё, что нужно мне. Но с ограничением: так как он просто посылает SEND-KEYS, то необходимо чтобы приложение было либо активным, либо понимало глобальные "хоткеи" (в принципе несложно сделать и SendMessage).

Сама задача в nncron.tab:
Code: Select all
#( Mute
NoLog
WatchHotKey: "{VOLUME_MUTE}"
Action:
MIXER-STATE
IF
  MIXER-MUTE
  OSD-CLEAR
  OSD-FONT: "Arial" 50 0x00FF0000
  S" Звук ВЫКЛЮЧЕН (" MIXER-VOLUME@ N>S S+ PERCENT S+ S" )" S+ OSD 2000 PAUSE OSD-CLEAR
ELSE
  MIXER-UNMUTE
  OSD-CLEAR
  S" Звук ВКЛЮЧЕН " MIXER-VOLUME@ N>S S+ PERCENT S+ OSD 2000 PAUSE OSD-CLEAR
THEN
)#

#( VolDown
NoLog
WatchHotKey: "{VOLUME_DOWN}"
Action:
OSD-CLEAR
1 MIXER-DOWN
MIXER-STATE NOT
IF
  OSD-FONT: "Arial" 50 0x00FF0000
THEN
S" Громкость " MIXER-VOLUME@ N>S S+ PERCENT S+ OSD 2000 PAUSE OSD-CLEAR
)#

#( VolUp
NoLog
WatchHotKey: "{VOLUME_UP}"
Action:
OSD-CLEAR
1 MIXER-UP
MIXER-STATE NOT
IF
  OSD-FONT: "Arial" 50 0x00FF0000
THEN
S" Громкость " MIXER-VOLUME@ N>S S+ PERCENT S+ OSD 2000 PAUSE OSD-CLEAR
)#

#( PlayPause
NoLog
AsLoggedUser
LoadProfile
WatchHotKey: "{MEDIA_PLAY_PAUSE}"
Action:
PROC-EXIST: "winamp.exe" NOT FILE-EXIST: "C:\Program Files\Winamp\winamp.exe" AND
IF
  StartIn: "C:\Program Files\Winamp" ShowMinimized NormalPriority START-APP: "C:\Program Files\Winamp\winamp.exe"
  PROC-ID PROC-WAIT-IDLE
  PAUSE: 200
THEN
PROC-EXIST: "winamp.exe"
IF
  SEND-KEYS: "@(^{INSERT})"
THEN
)#

#( WinAmp_NP
NoLog
WatchFile: "C:\Program Files\nnCron\winamp.txt"
Action:
OSD-CLEAR
S" C:\Program Files\nnCron\winamp.txt" FILE OSD
PAUSE: 2500
OSD-CLEAR
)#

#( App_NP
NoLog
WatchFile: "c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt"
Action:
OSD-CLEAR
OSD-FONT: "Arial" 100 0x0000FF00
S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE 4 - OSD
PAUSE: 2500
OSD-CLEAR
)#

#( App_Run
AsLoggedUser
LoadProfile
NoLog
WatchProc: "Sasami2000.exe"
WatchProc: "Winamp.exe"
WatchProc: "BSPlayer.exe"
WatchProc: "ACDSee5.exe"
WatchProc: "AverTV.exe"
WatchProc: "AmpView.exe"
Action:
WATCH-PROC-ID PROC-NAME AVER_APP
)#

#( App_Stop
AsLoggedUser
LoadProfile
NoLog
WatchProcStop: "Sasami2000.exe"
WatchProcStop: "Winamp.exe"
WatchProcStop: "BSPlayer.exe"
WatchProcStop: "ACDSee5.exe"
WatchProcStop: "AverTV.exe"
WatchProcStop: "AmpView.exe"
Action:
S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE
FOR-FILES: "C:\Program Files\nnCron\plugins\Aver\App*.txt"
           FOUND-FILENAME 3 - 3 /STRING S" exe" S+ PROC-EXIST?
           IF
             FOUND-FILENAME 3 - 3 /STRING S" exe" S+ S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FWRITE
             FF-EXIT
           THEN
;FOR-FILES
S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE COMPARE NOT
IF
  S" Keyb.exe" S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FWRITE
THEN
)#

#( RemoteAver
SingleInstance
NoLog
AsLoggedUser
LoadProfile
VARIABLE line_num
CREATE key_code 32 ALLOT
WatchAVer
Action:
0 line_num !
FILE-EXIST: "c:\Program Files\nnCron\PLUGINS\Aver\CodAver.txt" NOT FILE-EXIST: "C:\Program Files\nnCron\Flags\AverADD.sem" OR
IF
  FILE-EXIST: "C:\Program Files\nnCron\Flags\AverADD.sem" NOT
  IF
    S" 1" crlf S+ S" C:\Program Files\nnCron\Flags\AverADD.sem" FWRITE
    OSD-FONT: "Arial" 100 0x00FF0000
    S" Необходимо настроить пульт!" OSD 5000 PAUSE OSD-CLEAR
    S" Нажмите TV/FM" HINT
    S" C:\Program Files\nnCron\PLUGINS\Aver\CodAver.txt" FCREATE
    EXIT
  THEN
  S" C:\Program Files\nnCron\PLUGINS\Aver\CodAver.txt" FILE S" /\b" aver_code @ N>S S+ S" \B/" S+ RE-MATCH aver_code @ 0= OR
  IF
    EXIT
  THEN
  aver_code @ N>S crlf S+ S" C:\Program Files\nnCron\PLUGINS\Aver\CodAver.txt" FAPPEND
  HINT-OFF
  S" C:\Program Files\nnCron\Flags\AverADD.sem" FILE S>NUM 1 + DUP 36 > \ 36 - количество кнопок на пульте
  IF
    FILE-DELETE: "C:\Program Files\nnCron\Flags\AverADD.sem"
    HINT-OFF
    OSD-FONT: "Arial" 100 0x0000FF00
    OSD-CLEAR S" Пульт настроен!" OSD 5000 PAUSE OSD-CLEAR
    DROP
    EXIT
  THEN
  N>S S" C:\Program Files\nnCron\Flags\AverADD.sem" FWRITE
  READ-BY-LINE: "c:\Program Files\nnCron\PLUGINS\Aver\KEYAver.txt"
                line_num @ 1 + line_num !
                S" C:\Program Files\nnCron\Flags\AverADD.sem" FILE S>NUM line_num @ =
                IF
                  S" Нажмите " 2SWAP S+ HINT
                  0
                ELSE
                  2DROP
                  -1
                THEN
  ;?READ-BY-LINE
ELSE
  aver_code @ 0=
  IF
    EXIT
  THEN
  READ-BY-LINE: "C:\Program Files\nnCron\PLUGINS\Aver\CodAver.txt"
                line_num @ 1 + line_num !
                S>NUM aver_code @ = NOT
  ;?READ-BY-LINE
  READ-BY-LINE: "C:\Program Files\nnCron\PLUGINS\Aver\KEYAver.txt"
                key_code PLACE
                line_num @ 1 - line_num !
                line_num @
  ;?READ-BY-LINE
  key_code COUNT S" DISPLAY" COMPARE
  IF
    FILE-EXIST: "C:\Program Files\nnCron\Flags\AverDisp.sem"
    IF
      S" C:\Program Files\nnCron\Flags\AverDisp.sem" FDELETE
    THEN
  ELSE
    FILE-EXIST: "C:\Program Files\nnCron\Flags\AverDisp.sem"
    IF
      S" c:\Program Files\nnCron\Flags\AverDisp.sem" FILE
      FOR-FILES: "C:\Program Files\nnCron\plugins\Aver\App*.txt"
                 FOUND-FILENAME 3 - 3 /STRING S" exe" S+ 2DUP PROC-EXIST? NOT >R 2DUP S" Mouse.exe" COMPARE >R 2DUP S" Keyb.exe" COMPARE R> AND R> AND
                 IF
                   2DROP
                 ELSE
                   2DUP S" /" 2SWAP S+ S" /i" S+ S" C:\Program Files\nnCron\Flags\AverDisp.sem" FILE 2SWAP RE-MATCH
                   IF
                     2DROP
                   ELSE
                     2DUP S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FWRITE
                     crlf S+ S" C:\Program Files\nnCron\Flags\AverDisp.sem" FAPPEND
                     PAUSE: 1500
                     FF-EXIT
                   THEN                   
                 THEN
      ;FOR-FILES
      S" c:\Program Files\nnCron\Flags\AverDisp.sem" FILE COMPARE NOT
      IF
        S" C:\Program Files\nnCron\Flags\AverDisp.sem" READ-BY-LINE
           2DUP PROC-EXIST? NOT >R 2DUP S" Mouse.exe" COMPARE >R 2DUP S" Keyb.exe" COMPARE R> AND R> AND
           IF
             2DROP
             -1
           ELSE
             S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FWRITE
             0
           THEN
        ;?READ-BY-LINE
        S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE crlf S+ S" C:\Program Files\nnCron\Flags\AverDisp.sem" FWRITE
      THEN
    ELSE
      OSD-FONT: "Arial" 100 0x0000FF00
      OSD-CLEAR S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE 4 - OSD 2000 PAUSE OSD-CLEAR
      S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE crlf S+ S" C:\Program Files\nnCron\Flags\AverDisp.sem" FWRITE
    THEN
    EXIT
  THEN
  0 CASE
        key_code COUNT S" POWER" COMPARE OF SEND-KEYS: "@{F4}" PAUSE: 1000 ENDOF
        key_code COUNT S" AUDIO" COMPARE OF PlayPause RUN ENDOF
        key_code COUNT S" VIDEO" COMPARE OF
                                           PROC-EXIST: "Sasami2000.exe" NOT FILE-EXIST: "C:\Program Files\Sasami2k\Sasami2000.exe" AND
                                           IF
                                             OSD-CLEAR
                                             OSD: "Sasami 2000" 2500
                                             StartIn: "C:\Program Files\Sasami2k" ShowNormal NormalPriority START-APP: "C:\Program Files\Sasami2k\Sasami2000.exe"
                                           THEN
                                         ENDOF
        key_code COUNT S" MUTE" COMPARE OF Mute RUN ENDOF
        key_code COUNT S" VOLUME_DOWN" COMPARE OF VolDown LAUNCH ENDOF
        key_code COUNT S" VOLUME_UP" COMPARE OF VolUp LAUNCH ENDOF
        key_code COUNT S" TV/FM" COMPARE OF
                                           PROC-EXIST: "AVerTV.exe" NOT FILE-EXIST: "C:\Program Files\AVerTV\AVerTV.exe" AND
                                           IF
                                             StartIn: "C:\Program Files\AVerTV" START-APP: "C:\Program Files\AVerTV\AVerTV.exe"
                                           THEN
                                         ENDOF
        0 OF
            S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE 2DUP PROC-EXIST? NOT >R 2DUP S" Mouse.exe" COMPARE >R S" Keyb.exe" COMPARE R> AND R> AND
            IF
              S" " S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FWRITE
              FOR-FILES: "C:\Program Files\nnCron\plugins\Aver\App*.txt"
                         FOUND-FILENAME 3 - 3 /STRING S" exe" S+ PROC-EXIST?
                         IF
                           FOUND-FILENAME 3 - 3 /STRING S" exe" S+ S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FWRITE
                         THEN
              ;FOR-FILES
            THEN
            S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FSIZE 4. D<
            IF
              EXIT
            THEN
            S" c:\Program Files\nnCron\PLUGINS\Aver\App" S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE 3 - S+ S" txt" S+ READ-BY-LINE
               OVER key_code C@ key_code COUNT COMPARE
               IF
                 2DROP
                 -1
               ELSE
                 S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FILE S" Mouse.exe" COMPARE
                 IF
                   key_code C@ 1 + /STRING SEND-KEYS
                 ELSE
                   key_code C@ 1 + /STRING 2DUP
                   S" LBCLK" COMPARE
                   IF
                     2DUP S" RBCLK" COMPARE
                     IF
                       2DUP 3 /STRING S>NUM >R 3 - S>NUM R> MOUSE-MOVER
                     ELSE
                       MOUSE-RBCLK
                       2DROP
                     THEN                     
                   ELSE
                     MOUSE-LBCLK
                     2DROP
                   THEN                   
                 THEN
                 0
               THEN
            ;?READ-BY-LINE
          ENDOF
  ENDCASE
THEN
)#

Описания слов в My_Words.spf (вынес в отдельный плагин, но можно писать и в основном табе между <%...%>):
Code: Select all
\ Мои слова
: (?READ-BY-LINE) { xt \ Lf Lc fEND -- }  ( a u xt -- )
-1 TO fEND
1024 ALLOCATE THROW TO Lc
R/O OPEN-FILE-SHARED THROW TO Lf
BEGIN
     Lc 1022 Lf READ-LINE THROW fEND AND
WHILE
     Lc + 0 SWAP C!
     Lc ASCIIZ> xt EXECUTE TO fEND
REPEAT
DROP Lf CLOSE-FILE DROP Lf FREE DROP ;

: (READ-BY-LINE) { xt \ Lf Lc fEND -- }  ( a u xt -- )
1024 ALLOCATE THROW TO Lc
R/O OPEN-FILE-SHARED THROW TO Lf
BEGIN
     Lc 1022 Lf READ-LINE THROW
WHILE
     Lc + 0 SWAP C!
     Lc ASCIIZ> xt EXECUTE
REPEAT
DROP Lf CLOSE-FILE DROP Lf FREE DROP ;

: READ-BY-LINE
    POSTPONE [NONAME
; IMMEDIATE

: ;READ-BY-LINE
    POSTPONE NONAME]
    POSTPONE (READ-BY-LINE)
; IMMEDIATE

: ;?READ-BY-LINE  ( ? -- )
    POSTPONE NONAME]
    POSTPONE (?READ-BY-LINE)
; IMMEDIATE

: READ-BY-LINE: eval-string,  POSTPONE READ-BY-LINE ; IMMEDIATE

: AVER_APP ( a u )
2DUP PROC-EXIST?
IF
  S" c:\Program Files\nnCron\PLUGINS\Aver\CurrApp.txt" FWRITE
  FILE-EXIST: "C:\Program Files\nnCron\Flags\AverDisp.sem"
  IF
    S" C:\Program Files\nnCron\Flags\AverDisp.sem" FDELETE
  THEN
ELSE
  2DROP
THEN ;


Теперь в папку c:\Program Files\nnCron\PLUGINS\Aver\ кидаем такие файлы:
KEYAver.txt - список кнопок на пульте:
Code: Select all
TV/FM
CD
TELETEX
POWER
1
2
3
VIDEO
4
5
6
AUDIO
7
8
9
FULL_SCREEN
0
DISPLAY
LOOP
PREVIEW
AUTOSCAN
FREEZE
CAPTURE
MUTE
RECORD
PAUSE
STOP
PLAY
RED
VOLUME_DOWN
VOLUME_UP
YALLOW
GREEN
CHANNEL_DOWN
CHANNEL_UP
BLUE


И файлы типа App*.txt, где "*" - имя процесса. Например:
AppACDSee5.txt:
Code: Select all
2 {UP}{DELAY 200}
4 {LEFT}{DELAY 200}
6 {RIGHT}{DELAY 200}
8 {DOWN}{DELAY 200}
0 {ENTER}{DELAY 500}
FULL_SCREEN {ENTER}
LOOP /
PREVIEW *
CHANNEL_DOWN {PGUP}{DELAY 500}
CHANNEL_UP {PGDN}{DELAY 500}

В теле файла пишем имя кнопки на пульте (как она записана в KEYAver.txt), затем через пробел то, что за комбинацию хотим послать окну приложения.
Ещё примеры:
AppKeyb.txt
Code: Select all
1 {HOME}{DELAY 500}
2 {UP}{DELAY 200}
4 {LEFT}{DELAY 200}
6 {RIGHT}{DELAY 200}
8 {DOWN}{DELAY 200}
9 {END}{DELAY 500}
0 {ENTER}{DELAY 500}
AUTOSCAN {ESC}{DELAY 500}
FREEZE {TAB}{DELAY 500}
CAPTURE {BACKSPACE}{DELAY 500}

AppMouse.txt - здесь лучше ничего не трогать, цифра "5" - скорость перемещения мышки в пикселях:
Code: Select all
1 -5 -5
2 00 -5
3 05 -5
4 -5 00
6 05 00
7 -5 05
8 00 05
9 05 05
RED LBCLK
YALLOW RBCLK

AppWinamp.txt - убедитесь, что ваши глобальные хоткеи совпадают с моими:
Code: Select all
AUTOSCAN $(^(@s)){DELAY 500}
PAUSE ^(@{HOME}){DELAY 500}
STOP {MEDIA_STOP}
PLAY @(^x){DELAY 500}
GREEN @(^{LEFT}){DELAY 500}
CHANNEL_DOWN @(^{PGUP}){DELAY 500}
CHANNEL_UP @(^{PGDN}){DELAY 500}
BLUE @(^{RIGHT}){DELAY 500}

И так далее. Каждому файлу App*.txt должна соответствовать WatchProc/WatchProcStop в задачах App_Run и App_Stop если хотите, чтобы при запуске приложения крон брал настройки из соответсвующего файла [например при запуске Winamp'a крон автоматически переключался на AppWinamp.txt] и при остановке текущего приложения крон переключится на другое приложение или на эмуляцию клавиатурного курсора.

Кнопка DISPLAY переключает приложения.

Необходимо подключить также плагины AverTV.spf и osd.spf и библиотека averapi.dll.
При первом нажатии на любую кнопку пульта потребуется настроить пульт - понажимать на его кнопки в соответствии с вопросами крона.

Ещё вопрос - кто-нибудь может сделать ещё библиотеки типа averapi.dll, но для других тюнеров?
Last edited by Dark_Jones on Sat, 20 Oct 2007, 22:59, edited 1 time in total.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

Postby VoidVolker » Sat, 20 Oct 2007, 17:50

Code: Select all
так как он просто посылает SEND-KEYS, то необходимо чтобы приложение было либо активным, либо понимало глобальные "хоткеи"

Используй S" win" WIN-SEND-KEYS. Или просто добавь перед SEND-KEYS S" win" WIN-ACTIVATE.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Postby Dark_Jones » Sat, 20 Oct 2007, 21:40

VoidVolker wrote:Используй S" win" WIN-SEND-KEYS. Или просто добавь перед SEND-KEYS S" win" WIN-ACTIVATE.

WIN-SEND-KEYS не всегда посылает код нужному окну.
И, кстати, как зная имя (PID) процесса получить имя (handle) окна?
Задачу "наоборот" - нашёл, а вот эту - нет. :oops:

Было бы лучше узнать SEndMessage, но откуда брать эти цифры - не понимаю. Что такое апи нужного приложения - тоже не знаю. Так что пробелов у меня ещё много.
Пока это не мешает - Winamp в фоне понимает глобал_хот_кеи, а всякие видеоплееры и ACDSee работают в активном окне.
Dark_Jones
 
Posts: 414
Joined: Thu, 09 Nov 2006, 00:43
Location: Russia, S.Peterburg

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 4 guests

cron