Иконка с процессами и задачами (два в одном)

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

Иконка с процессами и задачами (два в одном)

Postby Morituruz » Sat, 23 Jun 2012, 20:57

Есть такая программа «Aston», а к ней есть плагин «Terminator». Он добавляет в область уведомлений иконку со списком процессов для их быстрого и удобного убийства:
Image
Штука очень полезная в том числе и тем, что видно, какой процесс был запущен последним.
Давно хотел такое же для nncron, и вот сделал.

Возможности иконки::
1. Левый клик — меню с процессами (имя_процесса (PID) имя_пользователя)
+ процесс запустившийся последним находится вверху списка (удобный контроль за тем, что сейчас запустилось);
+ по клику на процесс этот процесс мягко завершается (PROC-CLOSE);
+ клик с shift-ом убивает процесс (kill);
+ клик с ctrl-ом и shift-ом — завершение процесса и повторный запуск (с учётом его командной строки!);
- к сожалению 64-битные процессы в список попасть просто не могут (ограничение системы и nncron);
- имя пользователя в 64 битных системах может не определяться.
Image

2. Правый клик — список задач
+ меню вызывается горячей клавишей;
+ Запуск задачи из первого уровня меню (в меню nncron задачи на втором, третьем и т.п. уровне);
+ Если в человеческом названии поставить обратный слеш («\»), то эта задача выделится в отдельное подменю;
+ Можно назвать задачу как угодно;
+ Вы сами составляете этот список;
+ Можно выводить эту иконку для ограниченного пользователя, которому требуется выполнить какую-либо задачу, при этом нет доступа к самому меню nncron, да и вообще трудно идентифицировать программу, которая создала эту иконку;
± Видимая длина списка ограничена вертикальным разрешением экрана, дальше появляется прокрутка.
Image

а теперь и с группировкой:
Image

Для работы требуются плагины keystate, autostrings, lists, а так же вот эти слова для работы с процессами
Code: Select all
<%
\ для иконки со списком процессов
VARIABLE kp_icon_id
VARIABLE kp_thread_id \ для управления потоком
GLOBAL-LIST: kp_menu_items

: PID>NAME \ ( pid -- a u )
 PAD PAD-SIZE ERASE
 0 0x410 OpenProcess >R
 PAD
 PAD-SIZE PAD 0 R@ GetModuleBaseNameA
 R> CloseHandle DROP
;

: make_kp_menu_popup
kp_menu_items LIST-FREE
S" *" FOR-PROCS
   \ отсекаем ненужные процессы по вкусу (например системные, которые лучше не трогать)
   FOUND-PROC S" smss.exe" ICOMPARE 0=
   FOUND-PROC S" ctfmon.exe" ICOMPARE 0= OR
   FOUND-PROC S" Explorer.EXE" ICOMPARE 0= OR
   FOUND-PROC S" lsass.exe" ICOMPARE 0= OR
   FOUND-PROC S" lserver.exe" ICOMPARE 0= OR
   FOUND-PROC S" splwow64.exe" ICOMPARE 0= OR
   FOUND-PROC S" svchost.exe" ICOMPARE 0= OR
   FOUND-PROC S" winlogon.exe" ICOMPARE 0= OR
   FOUND-PROC S" wmiprvse.exe" ICOMPARE 0= OR
   FOUND-PROC S" csrss.exe" ICOMPARE 0= OR
   FOUND-PROC S" services.exe" ICOMPARE 0= OR
   FOUND-PROC S" spoolsv.exe" ICOMPARE 0= OR
   NOT
   IF
      FOUND-PID !kp_menu_items
   THEN
;FOR-PROCS
POPUPMENU
\ здесь можно добавить свои пункты, например перезагрузку:
S" Force poweroff (reboot)" 1 MENUITEM
MENUSEPARATOR
kp_menu_items(
   NODE@ PID>NAME ?DUP
   IF
      "  (%NODE@ N>S%) " S+ NODE@ PIDEXE->USER IF 2DROP S+ THEN NODE@ MENUITEM
   ELSE
      DROP
   THEN
)kp_menu_items
END-MENU
;

: start-kp_menu-item ( id --   )
\ по нажатию на пункт
\ просто так — программа закрывается
\ + shift — процесс убивается
\ + ctrl + shift процесс перезапускается
DUP kp_menu_items LIST? ?DUP
IF
   VK_LSHIFT KEY-PRESSED?
   VK_RSHIFT KEY-PRESSED?
   OR
   IF
      VK_LCONTROL KEY-PRESSED?
      VK_LCONTROL KEY-PRESSED?
      OR
      IF
         \ перезапускаем процесс
         \ первый нолик для StartApp
         0 SWAP kp_menu_items NODE>@ DUP GetProcessCmdLine
         ROT DUP PROC-FULLNAME
         ROT N>S PROC-CLOSE
         500 PAUSE
         ONLYDIR START-IN
         StartApp DROP
      ELSE
         \ убиваем процесс
         kp_menu_items NODE>@ kill
      THEN
   ELSE
      \ убиваем процесс нежно
      kp_menu_items NODE>@ N>S PROC-CLOSE
   THEN
   DROP
ELSE
   \ а здесь собственные пункты
   1 =
   IF
      VK_LSHIFT KEY-PRESSED?
      VK_RSHIFT KEY-PRESSED?
      OR
      IF
         32 1 262144 + + S" Force reboot" DROP " Вы уверены?" DROP 0 MessageBoxA 1 =
         IF
            \ MSG: "REBOOT"
            FORCE-REBOOT
         THEN
      ELSE
         32 1 262144 + + S" Force poweroff" DROP " Вы уверены?" DROP 0 MessageBoxA 1 =
         IF
            \ MSG: "POWEROFF"
            FORCE-POWEROFF
         THEN
      THEN
   THEN
THEN
;

: kp_menu
kp_icon_id @ ->CLASS TrayIcon hWnd @ SetForegroundWindow DROP
make_kp_menu_popup >R
\ делаем один из пунктов меню выделенным жирным шрифтом
\ 0 MI_S1 R@ SetMenuDefaultItem DROP
0 kp_icon_id @ ->CLASS TrayIcon hWnd @ CalcMenuYX
( TPM_RETURNCMD) 256 R@ TrackPopupMenuEx
?DUP IF start-kp_menu-item THEN
R> DestroyMenu DROP
;

\ для иконки со своим списком задач:
GLOBAL-STRING-LIST: tasks
GLOBAL-STRING-LIST: tasks_popups
VARIABLE tasks_icon_id
VARIABLE tasks_icon_thread_id

: add_task ( a u -- ) \ строка с человеческим названием задачи
CUR-TASK-NAME S" ;" S+ 2SWAP S+ 2DUP tasks LIST?
IF \ защита от повторного добавления задачи в список
   2DROP
ELSE
   !tasks
THEN
;

: make_tasks_menu_popup
\ сначала заносим те задачи, у которых есть "\" в названии в отдельный лист
tasks(
   NODE@ ONLYDIR 2DUP SWAP DROP 0<>
   IF
      2DUP S" ;" StringGetPos /STRING 2DUP tasks_popups LIST? NOT
      IF
         tasks_popups!
      ELSE
         2DROP
      THEN
   ELSE
      2DROP
   THEN
)tasks
POPUPMENU
\ добавляем подменю
tasks_popups(
   POPUP
   NODE@
   tasks(
      2DUP
      NODE@ 2DUP S" ;" StringGetPos /STRING ONLYDIR COMPARE 0=
      IF
         NODE@ ONLYNAME NODE MENUITEM
      THEN
   )tasks
   END-POPUP
)tasks_popups
\ добавляем оставшиеся пункты
tasks(
   NODE@ 2DUP S" \" StringGetPos NOT
   IF
      2DUP S" ;" StringGetPos /STRING NODE MENUITEM
   ELSE
      2DROP
   THEN
)tasks
END-MENU
;
: start_tasks_menu_item ( id -- )
tasks NODE>@ 2DUP S" ;" StringGetPos 1 - MIN EVALUATE LAUNCH
;
USER invisible_window
: tasks_menu
    WITH TrayIcon
    Z" static" 0 0 Window invisible_window !
    ENDWITH
make_tasks_menu_popup >R
    invisible_window @ SetForegroundWindow DROP
    0 invisible_window @
MOUSE-POS SWAP
( TPM_RETURNCMD) 256 R@ TrackPopupMenuEx
?DUP IF start_tasks_menu_item THEN
R> DestroyMenu DROP
;
%>


#( start_kill_proc_icon
\ 16:58 23.06.2012
\ создание иконки и меню на нее
Action:
kp_thread_id @ IF EXIT THEN
GetCurrentThreadId kp_thread_id !
S" Kill 'em all" S" .\icons\nncron.ico" LoadIcon ADD-TI kp_icon_id !
\ на правую клавишу вешаем своё меню с задачами:
['] tasks_menu kp_icon_id @ ->CLASS TrayIcon OnRB !
\ на левую вешаем меню с процессами
['] kp_menu kp_icon_id @ ->CLASS TrayIcon OnLB !
\ ну или можно повесить на двойной щелчок
\ ['] kp_menu kp_icon_id @ ->CLASS TrayIcon On2LB !
MessageLoop
kp_icon_id @ DEL-TI
)#

#( tasks_menu_hotkey
NoLog
WatchHotKey: "@t"
SingleInstance
Action:
tasks_menu
)#



В нужные задачи помещаем до слова Action: строку с названием задачи и слово add_task
Code: Select all
#( demonstration_task
S" задача для демонстрации add_task" add_task
NoLog
NoActive
Action:
MSG: "Это демонстрационная задача"
)#

и эта задача появится в меню.

Ещё я нарисовал иконку для этого дела:
Image
В коде предполагается, что эта иконка будет лежать в папке nncron в подпапке icons под названием nncron.ico

Разумеется можно совместить список задач и список процессов в одном меню, но в зависимости от количества процессов это всё может не влезать в экран.
Last edited by Morituruz on Thu, 26 Jul 2012, 09:08, edited 13 times in total.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Иконка с процессами и задачами (два в одном)

Postby VoidVolker » Sun, 24 Jun 2012, 08:38

Code: Select all
ICOMPARE +

Обычно
Code: Select all
ICOMPARE OR

Т.к. читабельнее.
Code: Select all
"  (%NODE@ N>S%)" S+

=
Code: Select all
"  %2SWAP% (%NODE@ N>S%) "

А так, в целом очень даже ничего решение.

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

Re: Иконка с процессами и задачами (два в одном)

Postby Morituruz » Sun, 24 Jun 2012, 10:44

Code: Select all
"  (%NODE@ N>S%) %2SWAP%"

а так не работает. Видимо потому, что MENUITEM хочет строку с нулём в конце. Этот момент у меня много кровушки попил, пока я догадался, поэтому и тут такая черахарда:
Code: Select all
CUR-TASK-NAME S" ;" S+ 2SWAP S+ !tasks


Кстати, задачу можно сразу называть по человечески и в список названий задач вносить без нижних подчеркиваний.

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

Re: Иконка с процессами и задачами (два в одном)

Postby VoidVolker » Sun, 24 Jun 2012, 10:57

Moriturus wrote:а так не работает. Видимо потому, что MENUITEM хочет строку с нулём в конце. Этот момент у меня много кровушки попил, пока я догадался, поэтому и тут такая черахарда:

Вообще, странно, должно же работать, ведь там тот же самый S+ используется для сложения строк. Т.е. в обоих случаях должен быть скомпилирован практически одинаковый код.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Иконка с процессами и задачами (два в одном)

Postby Morituruz » Mon, 25 Jun 2012, 09:36

Код обновлён!

VoidVolker wrote:Вообще, странно

Так вы меня спутали :) Надо же так:
Code: Select all
" %2SWAP% (%NODE@ N>S%) "

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

Re: Иконка с процессами и задачами (два в одном)

Postby VoidVolker » Mon, 25 Jun 2012, 13:43

Moriturus wrote:Так вы меня спутали :)

Пардон, действительно - поправил.
Moriturus wrote:Но при этом нужен какой-нибудь знак перед %2SWAP%, иначе пустая строка с другой не складывается (в данном случае это приводит к падению nncron), вы вроде мне об этом сами писали.

Проблема пустых строк давно решена - пустые строки-литералы просто выкидываются и не компилируются в код. А S+ спокойно их переваривает.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Иконка с процессами и задачами (два в одном)

Postby Morituruz » Mon, 25 Jun 2012, 13:45

Так у меня nncron падает, если без символа перед %2SWAP%
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Иконка с процессами и задачами (два в одном)

Postby VoidVolker » Mon, 25 Jun 2012, 13:47

А,тогда да, все верно - ведь пустая строка выкидывается. И свапить просто нечего =) В приницпе, если не критично - можно просто пробел поставить.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Иконка с процессами и задачами (два в одном)

Postby Morituruz » Mon, 25 Jun 2012, 13:50

Код обновлён!Добавлена проверка на повторное добавление задачи.
VoidVolker wrote:В приницпе, если не критично - можно просто пробел поставить.

Бритва оккама подсказывает, что пробел не нужен, если и без него всё хорошо.
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51

Re: Иконка с процессами и задачами (два в одном)

Postby Morituruz » Wed, 25 Jul 2012, 10:05

Обновлено.
Первый уровень хорошо, а группировка лучше!
Чтобы сгруппировать задачи в одну группу, нужно дописать название группы через обратную косую черту, например так:
Code: Select all
...
S" Обновления\скачать html страничку на опыты" add_task
...
S" Обновления\проверить обновления" add_task
...

Плюс вызов меню горячей клавишей (благодаря AlikasS-у).
Image
User avatar
Morituruz
 
Posts: 727
Joined: Sun, 14 Oct 2007, 01:51


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 3 guests