Теперь 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
;