1 (изменено: Selja8, 2014-07-28 17:18:04)

Тема: AHK: Убить ненужные процессы.

+ открыть спойлер
#SingleInstance,Force
#Persistent
SetBatchLines,-1
SendMode,Input
SetKeyDelay,0
#UseHook
#SingleInstance ignore
DetectHiddenWindows, on
HideArr := Object()
;********************************************
;Процессы которые добавятся поумолчанию.
my_sys=System Idle Process,Interrupts,DPCs,System,smss.exe,csrss.exe,wininit.exe,services.exe,svchost.exe,WmiPrvSE.exe,WmiPrvSE.exe,CorelPP.exe,dllhost.exe,svchost.exe,atiesrxx.exe,atieclxx.exe,svchost.exe,audiodg.exe,svchost.exe,WUDFHost.exe,wisptis.exe,wisptis.exe,dwm.exe,svchost.exe,svchost.exe,svchost.exe,spoolsv.exe,svchost.exe,Fuel.Service.exe,PsiService_2.exe,svchost.exe,SearchIndexer.exe,SearchProtocolHost.exe,SearchFilterHost.exe,svchost.exe,svchost.exe,taskhost.exe,OSPPSVC.EXE,lsass.exe,lsm.exe,csrss.exe,winlogon.exe,explorer.exe,RAVCpl64.exe,HydraDM.exe,HydraDM64.exe,CorelDRW.exe,EXCEL.EXE,WINWORD.EXE,WINWORD.EXE,MSACCESS.EXE,VISIO.EXE,MOM.exe,CCC.exe,AIMP3.exe,system.exe,AutoHotkey.exe
;********************************************
applicationname=System_run
gosub, INI
return
;********************************************


;********************************ADMINKA**************************************************

#f8:: 
        gosub, INI
        gosub, settings
    return
    
SETTINGS:
        Text := ""
for k in ComObjGet("winmgmts:").InstancesOf("Win32_Process")
        {
            IfNotInString, my_process, % k.Name
            {
                Text .= "`r`n," k.Name
            }
        }
        Sort, Text
        Text := ",Имена убиваемых процессов" ",`r`n" Text
    
        Gui,Destroy
        Gui,Add,GroupBox, x12 y10 w230 h350,&my_process
        Gui,Add,GroupBox, x262 y10 w230 h350,&my_process_ACTIVE
        Gui,Add,Button, x202 y380 w100 h30 GSETTINGSOK,Сохранить
        Gui,Add,Button, x332 y380 w100 h30 GSETTINGSCANCEL,&Отмена
        Gui,Add,Edit,x22 y30 w210 h320 vsmy_process,%my_process%
        Gui,Add,Edit,x272 y30 w210 h320 vsmy_process_ACTIVE,%Text%
        Gui,Show, x127 y87 h427 w509,%applicationname% Settings
    Return


SETTINGSOK:
        Gui,Submit
        my_process:=smy_process
        IniWrite,%my_process%,%applicationname%.ini,Settings,my_process
    Return

SETTINGSCANCEL:
        Gui,Destroy
    Return

INI:
    IfNotExist,%applicationname%.ini
        IniWrite, %my_sys% ,%applicationname%.ini,Settings,my_process
        IniRead,my_process,%applicationname%.ini,Settings,my_process
    If my_process=ERROR
        my_process=System Idle Process,Interrupts,DPCs,System,smss.exe,csrss.exe,wininit.exe,services.exe,svchost.exe,WmiPrvSE.exe,WmiPrvSE.exe,CorelPP.exe,dllhost.exe,svchost.exe,atiesrxx.exe,atieclxx.exe,svchost.exe,audiodg.exe,svchost.exe,WUDFHost.exe,wisptis.exe,wisptis.exe,dwm.exe,svchost.exe,svchost.exe,svchost.exe,spoolsv.exe,svchost.exe,Fuel.Service.exe,PsiService_2.exe,svchost.exe,SearchIndexer.exe,SearchProtocolHost.exe,SearchFilterHost.exe,svchost.exe,svchost.exe,taskhost.exe,OSPPSVC.EXE,lsass.exe,lsm.exe,csrss.exe,winlogon.exe,explorer.exe,RAVCpl64.exe,HydraDM.exe,HydraDM64.exe,CorelDRW.exe,EXCEL.EXE,WINWORD.EXE,WINWORD.EXE,MSACCESS.EXE,VISIO.EXE,Volume2.exe,MOM.exe,CCC.exe,AIMP3.exe,system.exe,AutoHotkey.exe,Bloody2.exe,Volume2.exe
    return


;********************************ADMINKA-END******************************
^F5::
processesWIN7 = %my_process%
processesXP =     %my_process%

if ((%A_OSVersion%=WIN_XP) or (%A_OSVersion%=WIN_2003)){
    processes:=processesXP
    EnvGet, PrFiles, PROGRAMFILES
}else{
    processes:=processesWIN7
    EnvGet, PrFiles, PROGRAMFILES(x86)
}
;собираем массив запущенных процессов
proc2 := Object()
for process in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
{
    proc2.insert(process.Name)
}
;фильтруем массив от повторяющихся элементов
proc2close := Object()
Loop % proc2.MaxIndex()
{
    if (proc2.MaxIndex() or proc.MaxIndex())<>0
    if % proc2[A_Index] <> proc[A_Index]
        proc2close.insert(proc2[A_Index])
}

;завершаем процессы
WinGet, ActiveW, ProcessName 
if ((%ActiveW%!=explorer.exe) or (%ActiveW%!=iexplore.exe)){
    WinClose, A
}

Loop % proc2close.MaxIndex()
{
    IfNotInString, processes, % proc2[A_Index]
    {
        Process, Close, % proc2[A_Index]
    }
}
DeleteDummyIcons()   ; вызов функции mod_1
#UseHook, off
return
;**************************END**********************************
;*************mod_1************serzh82saratov****Спасибо.*****
DeleteDummyIcons() 
{
/*
Недокументированная структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   PtrSize := A_Is64bitOS ? 8 : 4
   WM_USER := 0x400
   TB_BUTTONCOUNT := WM_USER + 24
   TB_GETBUTTON := WM_USER + 23
   SizeOfTBBUTTON := 8 + PtrSize*3
   SizeOfTRAYDATA := 16 + PtrSize*2
   
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   ControlGet, hTray, hwnd,, ToolbarWindow321, ahk_class Shell_TrayWnd
   ControlGet, hOverflow, hwnd,, ToolbarWindow321, ahk_class NotifyIconOverflowWindow
   WinGet, PID, PID, ahk_id %hTray%

   ; создаём буфер в адресном пространстве проводника для чтения данных
   RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA)   
   Dummy := []
   Loop 2
   {
      hwnd := A_Index = 1 ? hTray : hOverflow
      i := A_Index
      SendMessage, TB_BUTTONCOUNT,,,, ahk_id %hwnd%
      Loop % ErrorLevel
      {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr,, ahk_id %hwnd%
         ; получаем структуру TBBUTTON, в ней по смещению 8 + PtrSize адрес структуры TRAYDATA в адресном пространстве проводника
         pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON)   
         
         ; получаем структуру TRAYDATA
         pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON+0, 8 + PtrSize) - RemoteBuff.ptr)
         hWndIcon := NumGet(pTRAYDATA+0), uID := NumGet(pTRAYDATA + PtrSize, "UInt")
         
         ; если окна не существует (процесс не существует) — заносим в массив
         if !WinExist("ahk_id" hWndIcon)
            Dummy.Insert({hWnd: hWndIcon, uID: uID})   ;  вызов функции.
      }
   }
   DetectHiddenWindows, %DHW_Prev%
   for k, v in Dummy
      RemoveTrayIcon(v.hWnd, v.uID)   
}

RemoveTrayIcon(hWnd, uID)   
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, "UInt")
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize)
   DllCall("shell32\Shell_NotifyIcon", "UInt", NIM_DELETE := 2, Ptr, &NOTIFYICONDATA)
   Return
}

Class RemoteBuffer   ;  класс. После знака "{" следует содержимое класса.
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
      
      if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return ""
      
      if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return ""
      
      this.size := size
   }
   
   __Delete()
   {
      DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
      VarSetCapacity(LocalBuff, -1)
      Return &LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      return DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
   }
}
;*** teadrinker***Автор*кода_мода****mod_1_END****serzh82saratov****Спасибо.*****

Убивает все процессы, кроме перечисленных в списке.
ctrl+F5 убить процессы.
win+F8 Настройки.


Если кто-то, чем-то может & хочет помочь в усовершенствовании данного кода - пишите, выкладывайте.
Буду искренне рад.

2

Re: AHK: Убить ненужные процессы.

Хотелось бы узнать, какова практическая ценность. Если процессы не нужны, зачем их вообще было запускать?

3

Re: AHK: Убить ненужные процессы.

Допустим мы на работе и решили посмотреть кино или в игру поиграть. Выходит начальник с кабинета...
Хлоп и работа, только работа.
Или как вариант я дома добавил все значимые процессы.
Кто-нибудь из членов семьи полазил в инете и что-то скачал и установил.
Я сажусь за комп запускаю админку и вижу что что-то новое появилось. Не вирус ли?
Или комп заглючил. Что-бы не искать что убивать кнопочку нажал и всё хорошо. Программы на месте лишнего ни чего нет всё работает как часы.

4

Re: AHK: Убить ненужные процессы.

В настройках есть кнопочка CleenTRAY. Она Очистит иконки трея WIN_7.

Совсем плохой способ, возьми отсюда - http://forum.script-coding.com/viewtopi … 407#p83407.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5

Re: AHK: Убить ненужные процессы.

+ открыть спойлер
DeleteDummyIcons()
{
/*
Недокументированная структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   PtrSize := A_Is64bitOS ? 8 : 4
   WM_USER := 0x400
   TB_BUTTONCOUNT := WM_USER + 24
   TB_GETBUTTON := WM_USER + 23
   SizeOfTBBUTTON := 8 + PtrSize*3
   SizeOfTRAYDATA := 16 + PtrSize*2
   
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   ControlGet, hTray, hwnd,, ToolbarWindow321, ahk_class Shell_TrayWnd
   ControlGet, hOverflow, hwnd,, ToolbarWindow321, ahk_class NotifyIconOverflowWindow
   WinGet, PID, PID, ahk_id %hTray%

   ; создаём буфер в адресном пространстве проводника для чтения данных
   RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA)
   Dummy := []
   Loop 2
   {
      hwnd := A_Index = 1 ? hTray : hOverflow
      i := A_Index
      SendMessage, TB_BUTTONCOUNT,,,, ahk_id %hwnd%
      Loop % ErrorLevel
      {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr,, ahk_id %hwnd%
         ; получаем структуру TBBUTTON, в ней по смещению 8 + PtrSize адрес структуры TRAYDATA в адресном пространстве проводника
         pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON)
         
         ; получаем структуру TRAYDATA
         pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON+0, 8 + PtrSize) - RemoteBuff.ptr)
         hWndIcon := NumGet(pTRAYDATA+0), uID := NumGet(pTRAYDATA + PtrSize, "UInt")
         
         ; если окна не существует (процесс не существует) — заносим в массив
         if !WinExist("ahk_id" hWndIcon)
            Dummy.Insert({hWnd: hWndIcon, uID: uID})
      }
   }
   DetectHiddenWindows, %DHW_Prev%
   for k, v in Dummy
      RemoveTrayIcon(v.hWnd, v.uID)
}

RemoveTrayIcon(hWnd, uID)
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, "UInt")
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize)
   DllCall("shell32\Shell_NotifyIcon", "UInt", NIM_DELETE := 2, Ptr, &NOTIFYICONDATA)
   Return
}

Class RemoteBuffer
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
      
      if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return ""
      
      if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return ""
      
      this.size := size
   }
   
   __Delete()
   {
      DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
      VarSetCapacity(LocalBuff, -1)
      Return &LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      return DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
   }
}

Я правильно понял. Это часть скрипта отвечающая за очистку или я что-то упустил?
Не получается.Помогите пожалуйста.

6

Re: AHK: Убить ненужные процессы.

Всё правильно, надо просто вызвать функцию:

DeleteDummyIcons()
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7

Re: AHK: Убить ненужные процессы.

Selja8 пишет:

Кто-нибудь из членов семьи полазил в инете и что-то скачал и установил.
Я сажусь за комп запускаю админку и вижу что что-то новое появилось. Не вирус ли?
Или комп заглючил. Что-бы не искать что убивать кнопочку нажал и всё хорошо. Программы на месте лишнего ни чего нет всё работает как часы.

Извините, но это смешно - бороться с вирусом убиванием ненужных процессов. Кроме того, неэффективно, т. к. вирус может запускаться из "доверенного" файла, может самовосстанавливаться, может снять права на убивание собственного процесса. При этом продолжая удалять Ваши файлы, портить их, сливать личные данные куда-нибудь в Сеть, заражать съёмные носители, рассылать рекламу и т. д.
Решение - ограничить права пользователей на запуск посторонних программ.

Selja8 пишет:

Допустим мы на работе и решили посмотреть кино или в игру поиграть. Выходит начальник с кабинета...

Без комментариев...

8 (изменено: Selja8, 2014-07-27 15:18:06)

Re: AHK: Убить ненужные процессы.

ypppu пишет:

Извините, но это смешно - бороться с вирусом убиванием ненужных процессов. Кроме того, неэффективно, т. к. вирус может запускаться из "доверенного" файла, может самовосстанавливаться, может снять права на убивание собственного процесса. При этом продолжая удалять Ваши файлы, портить их, сливать личные данные куда-нибудь в Сеть, заражать съёмные носители, рассылать рекламу и т. д.
Решение - ограничить права пользователей на запуск посторонних программ.

С вирусом по средствам убивания мы не боримся. Мы его можем выявить из фильтра процессов который имеется в админке. Далее мы ищем способ бороться с ним.

9

Re: AHK: Убить ненужные процессы.

serzh82saratov пишет:

Всё правильно, надо просто вызвать функцию.

Только вот вызвать функцию что то для меня не просто оказалось.

GoSub Clean
Clean: 

Не могли бы вы продолжить вызов после слова Clean.

10 (изменено: Selja8, 2014-07-27 16:14:17)

Re: AHK: Убить ненужные процессы.

Alectric пишет:

DeleteDummyIcons()   ;   эта строка в любом месте кода и есть вызов функции.

И так и этак.
Даже через горячую клавишу вызов функции из самой себя пробовал.
Всё перепробовал, не хочет заводиться.

11 (изменено: Alectric, 2014-07-27 16:01:12)

Re: AHK: Убить ненужные процессы.

DeleteDummyIcons()   ;   эта строка в любом месте кода и есть вызов функции.
GoSub Clean
Clean:
return
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

12

Re: AHK: Убить ненужные процессы.

+ открыть спойлер
DeleteDummyIcons()
{
/*
Недокументированная структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   PtrSize := A_Is64bitOS ? 8 : 4
   WM_USER := 0x400
   TB_BUTTONCOUNT := WM_USER + 24
   TB_GETBUTTON := WM_USER + 23
   SizeOfTBBUTTON := 8 + PtrSize*3
   SizeOfTRAYDATA := 16 + PtrSize*2
   
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   ControlGet, hTray, hwnd,, ToolbarWindow321, ahk_class Shell_TrayWnd
   ControlGet, hOverflow, hwnd,, ToolbarWindow321, ahk_class NotifyIconOverflowWindow
   WinGet, PID, PID, ahk_id %hTray%

   ; создаём буфер в адресном пространстве проводника для чтения данных
   RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA)
   Dummy := []
   Loop 2
   {
      hwnd := A_Index = 1 ? hTray : hOverflow
      i := A_Index
      SendMessage, TB_BUTTONCOUNT,,,, ahk_id %hwnd%
      Loop % ErrorLevel
      {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr,, ahk_id %hwnd%
         ; получаем структуру TBBUTTON, в ней по смещению 8 + PtrSize адрес структуры TRAYDATA в адресном пространстве проводника
         pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON)
         
         ; получаем структуру TRAYDATA
         pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON+0, 8 + PtrSize) - RemoteBuff.ptr)
         hWndIcon := NumGet(pTRAYDATA+0), uID := NumGet(pTRAYDATA + PtrSize, "UInt")
         
         ; если окна не существует (процесс не существует) — заносим в массив
         if !WinExist("ahk_id" hWndIcon)
            Dummy.Insert({hWnd: hWndIcon, uID: uID})
      }
   }
   DetectHiddenWindows, %DHW_Prev%
   for k, v in Dummy
      RemoveTrayIcon(v.hWnd, v.uID)
}

RemoveTrayIcon(hWnd, uID)
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, "UInt")
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize)
   DllCall("shell32\Shell_NotifyIcon", "UInt", NIM_DELETE := 2, Ptr, &NOTIFYICONDATA)
   Return
}

Class RemoteBuffer
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
      
      if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return ""
      
      if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return ""
      
      this.size := size
   }
   
   __Delete()
   {
      DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
      VarSetCapacity(LocalBuff, -1)
      Return &LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      return DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
   }
}

Если я правильно понял из кода что написан выше, то при вызове этой функции в трее должны почиститься все неиспользуемые значки. В том числе из списка настроек трея при условии если это приложение не запущено.
Всё верно?

13 (изменено: Alectric, 2014-07-27 17:31:54)

Re: AHK: Убить ненужные процессы.

http://www.script-coding.com/AutoHotkey/Functions.html

В приведенном выше коде только содержимое функций.
Кроме этого их еще надо вызвать:


DeleteDummyIcons()   ; вызов функции

DeleteDummyIcons()   ;  сама функция. После знака "{" следует содержимое функции.
{
/*
Недокументированная структура TRAYDATA
typedef TRAYDATA
{
IntPtr hwnd;
uint uID;
uint uCallbackMessage;
uint Reserved;
uint Reserved2;
IntPtr hIcon;
}
*/
   PtrSize := A_Is64bitOS ? 8 : 4
   WM_USER := 0x400
   TB_BUTTONCOUNT := WM_USER + 24
   TB_GETBUTTON := WM_USER + 23
   SizeOfTBBUTTON := 8 + PtrSize*3
   SizeOfTRAYDATA := 16 + PtrSize*2
   
   DHW_Prev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   ControlGet, hTray, hwnd,, ToolbarWindow321, ahk_class Shell_TrayWnd
   ControlGet, hOverflow, hwnd,, ToolbarWindow321, ahk_class NotifyIconOverflowWindow
   WinGet, PID, PID, ahk_id %hTray%

   ; создаём буфер в адресном пространстве проводника для чтения данных
   RemoteBuff := New RemoteBuffer(PID, SizeOfTRAYDATA)   ;  вызов функции с присвоением переменной результата функции
   Dummy := []
   Loop 2
   {
      hwnd := A_Index = 1 ? hTray : hOverflow
      i := A_Index
      SendMessage, TB_BUTTONCOUNT,,,, ahk_id %hwnd%
      Loop % ErrorLevel
      {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr,, ahk_id %hwnd%
         ; получаем структуру TBBUTTON, в ней по смещению 8 + PtrSize адрес структуры TRAYDATA в адресном пространстве проводника
         pTBBUTTON := RemoteBuff.Read(SizeOfTBBUTTON)   ;  вызов функции с присвоением переменной результата функции
         
         ; получаем структуру TRAYDATA
         pTRAYDATA := RemoteBuff.Read(SizeOfTRAYDATA, NumGet(pTBBUTTON+0, 8 + PtrSize) - RemoteBuff.ptr)
         hWndIcon := NumGet(pTRAYDATA+0), uID := NumGet(pTRAYDATA + PtrSize, "UInt")
         
         ; если окна не существует (процесс не существует) — заносим в массив
         if !WinExist("ahk_id" hWndIcon)
            Dummy.Insert({hWnd: hWndIcon, uID: uID})   ;  вызов функции.
      }
   }
   DetectHiddenWindows, %DHW_Prev%
   for k, v in Dummy
      RemoveTrayIcon(v.hWnd, v.uID)   ;  вызов функции.
}

RemoveTrayIcon(hWnd, uID)   ;  сама функция. После знака "{" следует содержимое функции.
{
   VarSetCapacity(NOTIFYICONDATA, size := A_PtrSize = 8 ? 848 : A_IsUnicode? 828 : 444, 0)
   NumPut(size, NOTIFYICONDATA, "UInt")
   NumPut(hWnd, NOTIFYICONDATA, A_PtrSize)
   NumPut(uID, NOTIFYICONDATA, 2*A_PtrSize)
   DllCall("shell32\Shell_NotifyIcon", "UInt", NIM_DELETE := 2, Ptr, &NOTIFYICONDATA)
   Return
}

Class RemoteBuffer   ;  класс. После знака "{" следует содержимое класса.
{
   __New(PID, size)
   {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20, PROCESS_VM_READ := 0x10
         , MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
      
      if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return ""
      
      if !(this.ptr := DllCall("VirtualAllocEx", UInt, this.hProc, UInt, 0, UInt, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return ""
      
      this.size := size
   }
   
   __Delete()
   {
      DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", Ptr, this.hProc)
   }
   
   Read(size, offset = 0)
   {
      static LocalBuff
      VarSetCapacity(LocalBuff, size, 0)
      DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, &LocalBuff, UInt, size, UInt, 0)
      VarSetCapacity(LocalBuff, -1)
      Return &LocalBuff
   }
   
   Write(pLocalBuff, size, offset = 0)
   {
      return DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, UInt, size, UInt, 0)
   }
}
Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

14

Re: AHK: Убить ненужные процессы.

Selja8 пишет:
serzh82saratov пишет:

Всё правильно, надо просто вызвать функцию.

Только вот вызвать функцию что то для меня не просто оказалось.

GoSub Clean
Clean: 

Не могли бы вы продолжить вызов после слова Clean.

Как то это очень странно, ещё вчера было понятно:


!space:: gosub 555
555:
SoundPlay, %INTRO%, wait
Speech(A_Hour, A_Min) 
return    
Speech(h, m)  { 
    a := StrSplit(h)
    SoundPlay, % (h = "00" ? 0 : a[1] = 0 ? "" : a[1] = 1 ? h : a[1] 0) ".wav", wait
    SoundPlay, % (a[1] = 1 || a[2] = 0 ? "" : a[2]) ".wav", wait
    SoundPlay, % "Hour_" compliance[h] ".wav", wait
    a := StrSplit(m)
    SoundPlay, % (a[1] = 0 ? "" : a[1] = 1 ? m : a[1] 0) ".wav", wait
    SoundPlay, % (a[1] = 1 || (a[2] = 0 && a[1] > 1) ? "" : a[2] = 1 || a[2] = 2 ? a[2] "M" : a[2]) ".wav", wait
    SoundPlay, % "Min_" compliance[m] ".wav", wait 
}  

а теперь внезапно непонятно.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15

Re: AHK: Убить ненужные процессы.

Был я тут, понятно всё, ну или почти всё.

В изложенном Вами кодом имеется вызов этих функций. Там же и пояснения имеются. Только вот код у меня так и не сработал.

16

Re: AHK: Убить ненужные процессы.

serzh82saratov пишет:

Как то это очень странно, ещё вчера было понятно,
а теперь внезапно непонятно.

Так не заработало же, вот я и думаю, что не так.

17 (изменено: Alectric, 2014-07-27 19:09:13)

Re: AHK: Убить ненужные процессы.

Selja8 пишет:

Был я тут, понятно всё, ну или почти всё.

В изложенном Вами кодом имеется вызов этих функций. Там же и пояснения имеются. Только вот код у меня так и не сработал.

Как проявляется "не срабатывание" кода?

Откройте какое нибудь приложение с иконкой в трее (тот же скрипт с "горячей клавишей" или циклом); затем завершите процесс в диспетчере задач; затем запустите скрипт который удаляет "пустые" иконки и возможно Вы увидите результат "срабатывания" ("пустые" иконки должны исчезнуть из трея).

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

18

Re: AHK: Убить ненужные процессы.

вот я и думаю, что не так.

Да, действительно не очевидно. Надо написать автору функции, чтобы добавил свето-звуковых эффектов при срабатывании, а то как то неинтересно получается.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19 (изменено: Selja8, 2014-07-28 07:55:37)

Re: AHK: Убить ненужные процессы.

Со стереоэффектами всё работает.

    Process, Close, explorer.exe
    RegDelete, HKEY_CURRENT_USER, Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify, IconStreams
    RegDelete, HKEY_CURRENT_USER, Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify, PastIconsStream
    Return

После удаления этих ключей очищается вся информация о ярлыках трея и их настроек.

+ открыть спойлер

https://yadi.sk/d/ZT8TVdOGXyvpC -до и после выполнения.

20

Re: AHK: Убить ненужные процессы.

Со стереоэффектами всё работает.

После удаления этих ключей очищается вся информация о ярлыках трея и их настроек.

Selja8 Это конечно очень радует, особенно наличие смайликов, но нам то, простым смертным как это понимать? Как божью благодать, или проклятье дьявола? Или Вам просто так хорошо, что нам и понимать ничего не надо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21 (изменено: Alectric, 2014-07-28 09:24:38)

Re: AHK: Убить ненужные процессы.

OFF:
Извините не удержался.

Win 10 x64
AHK v1.1.33.02
                       Справка тебе в помощь.

22 (изменено: Selja8, 2014-07-28 08:21:05)

Re: AHK: Убить ненужные процессы.

Я имею ввиду, что в коде указав Soundbeep. Он озвучивается. Из чего следует, что секция выполняется. Только вот такого как при удалении ключей не происходит. То-есть старые значки не удаляются.
Вижу только что повторные значки  действующих приложений вычищены.
Как если бы например значки  AuIT или AHK при многократном перезапуске.
Мы просто нажали развернуть трей и они сами по себе при анализе винды по одному исчезали.
А после выполнения данного Вами скрипта нажимаю на развернуть трей а там исчезать уже не чему.
С общими списками как на PRINTscrine ни чего не происходит.

serzh82saratov пишет:

Это конечно очень радует, особенно наличие смайликов, но нам то, простым смертным как это понимать? Как божью благодать, или проклятье дьявола? Или Вам просто так хорошо, что нам и понимать ничего не надо.

Извините не хотел ни кого расстраивать. Просто посмеялся вместе с вами.
Так что в итоге. Судя по Вашему коду "Если (Я ПРАВИЛЬНО ПОНЯЛ ?)" должно было произойти тоже что и у меня при удалении ключей (Имеется ввиду картинка "ДО\ПОСЛЕ"), только с более тонким отбором, который осуществляется через фильтр по запущенным приложениям.
У меня почему-то этого не происходит, хотя, вроде, все секции скрипта выполняются.

23

Re: AHK: Убить ненужные процессы.

Извините не хотел ни кого расстраивать.

Да нет, наоборот доставили.

Так что в итоге. Судя по Вашему коду "Если (Я ПРАВИЛЬНО ПОНЯЛ ?)" должно было произойти тоже что и у меня при удалении ключей (Имеется ввиду картинка "ДО\ПОСЛЕ")

Это как раз многие считают злом, если оно вас по каким то причинам устраивает, то за ради бога, удаляйте у себя в реестре что угодно.

Судя по Вашему коду

Автор увы не я, а teadrinker.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

24

Re: AHK: Убить ненужные процессы.

Спасибо, вроде разобрался.

25

Re: AHK: Убить ненужные процессы.

У меня на ноутбуке почему-то не работает - Windows 7 Домашняя расширенная. В смысле процессы не убиваются.

26 (изменено: Selja8, 2014-07-28 17:20:10)

Re: AHK: Убить ненужные процессы.

В коде была ошибка. Вместо (ctrl+f5) было (alt+f5).
В шапке исправил.