Икона nnCron'а

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

Икона nnCron'а

Postby dothen » Tue, 28 Mar 2017, 21:28

Развитие этой темы: Иконка с процессами и задачами (два в одном)

Теперь 16 в одном.

Назначает действия для кликов мышью по иконке nnCron
Можно делать левый, правый, двойной левый и двойной правый клик на иконке nnCron с нажатой клавишей Ctrl, Alt или Shift.

Меню со списком процессов завершает или перезапускает выбранный процесс.

Code: Select all
# Файл:       nncron_trayicon.tab
# Автор:      dothen
# Дата:       07.05.2017
# Версия:     1.1
# Описание:
# Назначает действия для кликов мышью по иконке nnCron.
# Можно делать левый, правый, двойной левый и двойной правый клик на иконке nnCron с нажатой клавишей Ctrl, Alt или Shift.

# Подключить плагины keystate.spf, procwin.spf, proccmdline.spf
# Подключить кронтаб nncron_extwords2.tab (http://www.nncron.ru/forums/viewtopic.php?f=5&t=13361#p35725)
# ------------------

# Файл nncron_trayicon.tab должен быть последним в списке кронтабов, или ближе к концу списка.
# Слова из кронтабов нельзя назначить в файле nncron.ini, т.к. кронтабы ещё не загружены.
# Переменные для назначения расположены после определения слова MenuTaskList.

<%

WINAPI: SetDlgItemTextA USER32.DLL

: ProcSetButtonText ( -- )
    10 0 DO
      10 PAUSE
      Z" Процессы" Z" #32770" FindWindowA ?DUP   \ Проверку делаем в цикле для того чтобы пауза перед выводом текста была минимальная.
      IF
        >R Z" Процесс завершить\перезапустить" R@ SetWindowTextA DROP \ Меняем заголовок чтобы при запуске нескольких задач FindWindowA находила последний открытый диалог.
        Z" kill"    7 R@ SetDlgItemTextA DROP  \ #define IDNO  7
        Z" Restart" 6 R> SetDlgItemTextA DROP  \ #define IDYES 6
       LEAVE
      THEN
    LOOP
;

: restart { pid -- }
    pid PROC-FULLNAME ONLYDIR START-IN
    0 pid PROC-CMDLINE
    pid kill
    BEGIN 100 PAUSE pid N>S PROC-EXIST? 0= UNTIL
    StartApp DROP
;

: Proc2MessageBox { pid -- }
    MENUITEM-TEXT >ZPAD CRLF +ZPAD
    GetDebugPriv
    pid PROC-FULLNAME +ZPAD \ Командная строка может не поместиться в ZPAD
    ['] ProcSetButtonText EXECUTE-LAUNCH
    0x40233 Z" Процессы" ZPAD 0 MessageBoxA \ 0x40233=MB_YESNOCANCEL+MB_DEFBUTTON3+MB_TOPMOST
    CASE
      6  OF pid restart ENDOF \ Да
      7  OF pid kill ENDOF    \ Нет
      DUP OF NOOP ENDOF
    ENDCASE
;

\ Меню список процессов, завершает или перезапускает выбранный процесс.
: MenuProcList ( -- )
    POPUPMENU
      POPUP
      S" *" -1 WTS-FOR-PROCS
        S" система SYSTEM NETWORK SERVICE LOCAL SERVICE"
        WTS-FOUND-USERSID SID2NAME 2DUP 2>R SEARCH NIP NIP
        WTS-FOUND-PROCESSID 8 > AND
        IF
          WTS-FOUND-PROCESSNAME >ZPAD
         [ OSx64? ] [IF] WTS-FOUND-PROCESSID Proc64? IF S"   (x64)" ELSE S"   (x32)" THEN +ZPAD [THEN]
          HTAB +ZPAD
          2R@ DUP 0= IF 2DROP S" система" THEN +ZPAD
          ZPAD> WTS-FOUND-PROCESSID MENUITEM
        THEN RDROP RDROP
      ;WTS-FOR-PROCS
      S" система"
      END-POPUP
      S" *" -1 WTS-FOR-PROCS
        S" система SYSTEM NETWORK SERVICE LOCAL SERVICE"
        WTS-FOUND-USERSID SID2NAME 2DUP 2>R SEARCH NIP NIP 0=
        WTS-FOUND-PROCESSID 8 > AND
        IF
          WTS-FOUND-PROCESSNAME >ZPAD
          [ OSx64? ] [IF] WTS-FOUND-PROCESSID Proc64? IF S"   (x64)" ELSE S"   (x32)" THEN +ZPAD [THEN]
          HTAB +ZPAD
          2R@ +ZPAD ZPAD>
          WTS-FOUND-PROCESSID MENUITEM
        THEN RDROP RDROP
      ;WTS-FOR-PROCS
    END-MENU
    RunMenu ?DUP IF Proc2MessageBox THEN
;

\ Меню "Выполнить задачу".
\ Получение списка задач, взято отсюда: http://www.nncron.ru/forums/viewtopic.php?p=9998
: MenuTaskList
    POPUPMENU
      POPUP
        CRON-LIST
        BEGIN @ ?DUP WHILE
        DUP CRON-NAME @
        COUNT >ZPAD ZPAD> S" CLASSIC-TASK-#-" SEARCH NIP NIP IF ZPAD> ZPAD> EVALUATE MENUITEM THEN
        REPEAT
        S" CLASSIC-TASK"
      END-POPUP
      CRON-LIST
      BEGIN @ ?DUP WHILE
      DUP  CRON-NAME @
      COUNT >ZPAD ZPAD> S" CLASSIC-TASK-#-" SEARCH NIP NIP IFNOT ZPAD> ZPAD> EVALUATE MENUITEM THEN
      REPEAT
    END-MENU
    RunMenu ?DUP
    IF LAUNCH THEN
;

\ Переменные для событий.
\ mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
\ Переменные для назначения на Левый клик.
' MenuTaskList   VALUE Mouse_LClick \ Левый одинарный клик
' winspy         VALUE  Ctrl_LClick
' add-reminder   VALUE Shift_LClick
' add-new-task   VALUE   Alt_LClick
\ Переменные для назначения на Левый двойной клик.
' open-help      VALUE Mouse_LDoubleClick \ Левый двойной клик
' show-log       VALUE  Ctrl_LDoubleClick
' options        VALUE Shift_LDoubleClick
' about          VALUE   Alt_LDoubleClick
\ Переменные для назначения на Правый клик.
' menu           VALUE Mouse_RClick \ Правый одинарный клик
' nncron-options VALUE  Ctrl_RClick
' NOOP           VALUE Shift_RClick
' NOOP           VALUE   Alt_RClick
\ Переменные для назначения на Правый двойной клик.
' MenuProcList VALUE Mouse_RDoubleClick \ Правый двойной клик
 :NONAME Z" calc.exe"    START-APP-LAUNCH ; VALUE  Ctrl_RDoubleClick
 :NONAME Z" cmd.exe"     START-APP-LAUNCH ; VALUE Shift_RDoubleClick
 :NONAME Z" notepad.exe" START-APP-LAUNCH ; VALUE   Alt_RDoubleClick
\ :NONAME 0 S" calc.exe"    GUIStartApp ; VALUE  Ctrl_RDoubleClick
\ :NONAME 0 S" cmd.exe"     GUIStartApp ; VALUE Shift_RDoubleClick
\ :NONAME 0 S" notepad.exe" GUIStartApp ; VALUE   Alt_RDoubleClick
\ mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
\ Всё, вставили нужное слово, файл сохранили, кронтабы перечитались, можно работать.

0 VALUE pressCtrl?
0 VALUE pressShift?
0 VALUE pressAlt?
0 VALUE pressWin?

\ Получить состояние клавиш модификаторов.
: getmodkeys ( -- )
    VK_CONTROL KEY-PRESSED? TO pressCtrl?
    VK_SHIFT   KEY-PRESSED? TO pressShift?
    VK_MENU    KEY-PRESSED? TO pressAlt?
    VK_LWIN    KEY-PRESSED? TO pressWin?
;

\ Проверяет сколько нажато клавиш модификаторов.
\ Если нажато ноль или одна клавиша - FALSE, если больше одной - TRUE.
: pressmodkeys? ( -- ? )  pressCtrl? pressShift? + pressAlt? + pressWin? + -1 < ;

: doubleclick? { vk -- ? }
    0 0
    15 0 DO
\      BEGIN vk KEY-PRESSED? WHILE DROP DUP 1+ 10 PAUSE  I . REPEAT ." 15" CR     \ Debug
      BEGIN vk KEY-PRESSED? WHILE DROP DUP 1+ 10 PAUSE REPEAT
      [ WinGVI? ] [IF] DUP 1 = vk VK_LBUTTON = AND IF LEAVE THEN [THEN] \ Если Vista или выше.
      DUP 2 = IF LEAVE THEN
      NIP DUP
      10 PAUSE
    LOOP
    -
;

\ Для правого клика.
: RClick
    pressCtrl?
    IF Ctrl_RClick ELSE
      pressShift?
      IF Shift_RClick ELSE
        pressAlt?
        IF Alt_RClick ELSE
          Mouse_RClick
        THEN
      THEN
    THEN
    EXECUTE
;

\ Для двойного правого клика.
: RDClick
    pressCtrl?
    IF Ctrl_RDoubleClick ELSE
      pressShift?
      IF Shift_RDoubleClick ELSE
        pressAlt?
        IF Alt_RDoubleClick ELSE
          Mouse_RDoubleClick
        THEN
      THEN
    THEN
    EXECUTE
;

\ Для левого клика.
: LClick
    pressCtrl?
    IF Ctrl_LClick ELSE
      pressShift?
      IF Shift_LClick ELSE
        pressAlt?
        IF Alt_LClick ELSE
          Mouse_LClick
        THEN
      THEN
    THEN
    EXECUTE
;

\ Для двойного левого клика.
: LDClick
    pressCtrl?
    IF Ctrl_LDoubleClick ELSE
      pressShift?
      IF Shift_LDoubleClick ELSE
        pressAlt?
        IF Alt_LDoubleClick ELSE
          Mouse_LDoubleClick
        THEN
      THEN
    THEN
    EXECUTE
;

:NONAME
    getmodkeys
    pressmodkeys? IF EXIT THEN
    VK_RBUTTON doubleclick? IF RDClick ELSE RClick THEN
; DUP TO TrayIconRightButton
      CronIcon OnRB ! \ На всякий случай.

:NONAME
    getmodkeys
    pressmodkeys? IF EXIT THEN
    VK_LBUTTON doubleclick? IF LDClick ELSE LClick THEN
; CronIcon OnLB !


' NOOP TO TrayIconDoubleClick
' NOOP CronIcon On2LB ! \ На всякий случай.

\ Если в кронтабе делать просто CronIcon OnRB ! или CronIcon On2LB ! то после старта nnCron надо еще раз перечитывать кронтабы,
\ т.к. в конце загрузки nnCron, OnRB и On2LB перезаписываются значениями которые заданы в nncron.ini,
\ т.е. значениями из переменных TrayIconRightButton и TrayIconDoubleClick (nnsrc.zip\cron\tray.f).

\ Если в nncron.ini для переменной TrayIconDoubleClick: назначено действие,
\ и на одинарный левый клик назначено действие (CronIcon OnLB !),
\ то при двойном левом клике выполняются сразу оба действия.



\EOF

 %>



\ Архив
\ ---------------------------------
\ Меню nnCron'а "Выполнить задачу".
\ Вытянул и высушил отсюда:   nnsrc.zip\cron\tray.f
: MenuTaskList2
    120 MenuID ! TaskMenuList 0!
    POPUPMENU
      0 TO only-crontab
      ['] start-task-action TO TaskMenuAction
      CRON-LIST MakeTaskMenu
    END-MENU
    >R
    WITH TrayIcon Z" Static" 0 0 Window >R ENDWITH
    R@ SetForegroundWindow DROP
    0 R> CalcMenuYX 260 R@ TrackPopupMenuEx
    ?DUP
    IF TO CHOICED-MENU-ID ['] exec-menu-item TaskMenuList DoList THEN
    R> DestroyMenu DROP
    ['] del-menu-item TaskMenuList DoList
    TaskMenuList FreeList
;


Last edited by dothen on Sun, 07 May 2017, 17:09, edited 1 time in total.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Икона nnCron'а

Postby dothen » Tue, 18 Apr 2017, 19:31

Переделал меню с процессами.
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58

Re: Икона nnCron'а

Postby dothen » Sun, 07 May 2017, 17:26

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

Проверял в XP и в Win7x64
dothen
 
Posts: 184
Joined: Mon, 16 Mar 2015, 04:58


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Google [Bot] and 12 guests