; Class_ProcessExplorer_Sample.ahk #NoEnv #SingleInstance Force ; #Include Class_ProcessExplorer.ahk SetBatchLines -1 global app := { name: "AHK_ProcessExplorer", version: "2017.10.00011", author: "jNizM", licence: "MIT" } global LV_Header := "Process Name|CPU|Private Bytes|Working Set|PID|User Name|Handles|Threads|Peak Working Set|PagefileUsage|PeakPagefileUsage|KernelTime|UserTime" global LV_Size := ["170", "50 Right", "80 Right", "80 Right", "50 Right", "225", "60 Right", "60 Right", "90 Right", "90 Right", "90 Right", "90 Right", "90 Right"] Gui, +hWndhMainGui Gui, Margin, 7, 7 Gui, Color, F1F5FB Gui, Add, ListView, xm ym w1250 h600 hWndhMainLv01, % LV_Header SetWindowTheme(hMainLv01) for i, v in LV_Size LV_ModifyCol(i, v) Gui, Add, Edit, xm y+7 w200 h21 hWndhMainEdt01 vMainEdt01 EM_SETCUEBANNER(hMainEdt01, "Process name here...") Gui, Add, Button, x+6 yp-1 w95 gSTART_EXPLORER, % "START" Gui, Add, StatusBar SB_SetParts(125, 125, 125, 125, 150, 150) Gui, Show, AutoSize, % app.name SET_HIDEFOCUS(hMainGui) WinSet, Redraw PE := new ProcessExplorer() return GuiClose: if (hClrBtn) DllCall("gdi32\DeleteObject", "ptr", hClrBtn) ExitApp return START_EXPLORER: Gui, Submit, NoHide PE.SetDebugPrivilege() WTS := PE.WTSEnumerateProcessesEx() GPI := PE.GetPerformanceInfo() LV_Delete() loop % WTS.MaxIndex() { if (InStr(WTS[A_Index, "ProcessName"], MainEdt01)) { LV_Add("", WTS[A_Index, "ProcessName"] , "" , PE.GetProcessMemoryInfo(ProcessID := WTS[A_Index, "ProcessId"]).PrivateUsage " K" , WTS[A_Index, "WorkingSetSize"] " K" , ProcessID , (WTS[A_Index, "UserName"] = "") ? "" : WTS[A_Index, "DomainName"] "/" WTS[A_Index, "UserName"] , WTS[A_Index, "HandleCount"] , WTS[A_Index, "NumberOfThreads"] , WTS[A_Index, "PeakWorkingSetSize"] " K" , WTS[A_Index, "PagefileUsage"] " K" , WTS[A_Index, "PeakPagefileUsage"] " K" , WTS[A_Index, "KernelTime"] , WTS[A_Index, "UserTime"] ) } } SB_SetText("CPU Usage: ... %", 1) SB_SetText("Processes: " GPI.ProcessCount, 2) SB_SetText("Threads: " GPI.ThreadCount, 3) SB_SetText("Handles: " GPI.HandleCount, 4) SB_SetText("Physical Usage: " PE.GlobalMemoryStatusEx().MemoryLoad "%", 5) SB_SetText("Up time: " PE.GetTickCount64(), 6) return WM_CTLCOLORBTN() ; https://msdn.microsoft.com/en-us/library/bb761849(v=vs.85).aspx { global hClrBtn static init := OnMessage(0x0135, "WM_CTLCOLORBTN") if !(hClrBtn) hClrBtn := DllCall("gdi32\CreateSolidBrush", "uint", 0xFBF5F1, "uptr") return hClrBtn } EM_SETCUEBANNER(handle, string) ; https://msdn.microsoft.com/en-us/library/bb761639(v=vs.85).aspx { static ECM_FIRST := 0x1500 static EM_SETCUEBANNER := ECM_FIRST + 1 if (DllCall("user32\SendMessage", "ptr", handle, "uint", EM_SETCUEBANNER, "int", true, "str", string, "int")) return true return false } SetWindowTheme(handle) ; https://msdn.microsoft.com/en-us/library/bb759827(v=vs.85).aspx { if (DllCall("GetVersion") & 0xff >= 10) { VarSetCapacity(ClassName, 1024, 0) if (DllCall("user32\GetClassName", "ptr", handle, "str", ClassName, "int", 512, "int")) if (ClassName = "SysListView32") || (ClassName = "SysTreeView32") if !(DllCall("uxtheme\SetWindowTheme", "ptr", handle, "wstr", "Explorer", "ptr", 0)) return true } return false } SET_HIDEFOCUS(wParam, lParam := "", Msg := "", handle := "") ; https://msdn.microsoft.com/en-us/library/ms646361(v=vs.85).aspx { static Affected := [] static WM_UPDATEUISTATE := 0x0128 static UIS_SET := 0x1 static UISF_HIDEFOCUS := 0x1 static SET_HIDEFOCUS := UIS_SET << 16 | UISF_HIDEFOCUS static init := OnMessage(WM_UPDATEUISTATE, Func("SET_HIDEFOCUS")) if (Msg = WM_UPDATEUISTATE) { if (wParam = SET_HIDEFOCUS) Affected[handle] := true else if Affected[handle] DllCall("user32\PostMessage", "ptr", handle, "uint", WM_UPDATEUISTATE, "ptr", SET_HIDEFOCUS, "ptr", 0) } else if (DllCall("IsWindow", "ptr", wParam, "uint")) DllCall("user32\PostMessage", "ptr", wParam, "uint", WM_UPDATEUISTATE, "ptr", SET_HIDEFOCUS, "ptr", 0) } ; A Process Explorer / Taskmanager written in AutoHotkey ; ; EXPERIMENTAL - USE AT YOUR OWN RISK - TESTED WITH WIN10 64BIT Class ProcessExplorer { __New() { if !(this.hADVAPI := DllCall("LoadLibrary", "str", "advapi32.dll", "uptr")) throw Exception("LoadLibrary fails to load advapi32.dll: " A_LastError, -1) if !(this.hNTDLL := DllCall("LoadLibrary", "str", "ntdll.dll", "uptr")) throw Exception("LoadLibrary fails to load ntdll.dll: " A_LastError, -1) if !(this.hPSAPI := DllCall("LoadLibrary", "str", "psapi.dll", "uptr")) throw Exception("LoadLibrary fails to load psapi.dll: " A_LastError, -1) if !(this.hWTSAPI := DllCall("LoadLibrary", "str", "wtsapi32.dll", "uptr")) throw Exception("LoadLibrary fails to load wtsapi32.dll: " A_LastError, -1) } AdjustTokenPrivileges(hToken, LUID) ; https://msdn.microsoft.com/en-us/library/aa375202(v=vs.85).aspx { static SE_PRIVILEGE_ENABLED := 0x00000002 VarSetCapacity(TOKEN_PRIVILEGES, 16, 0) NumPut(1, TOKEN_PRIVILEGES, 0, "uint") NumPut(LUID, TOKEN_PRIVILEGES, 4, "int64") NumPut(SE_PRIVILEGE_ENABLED, TOKEN_PRIVILEGES, 12, "uint") if (DllCall("advapi32\AdjustTokenPrivileges", "ptr", hToken, "int", true, "ptr", &TOKEN_PRIVILEGES, "uint", 0, "ptr", 0, "ptr", 0)) return true return false } CloseHandle(hObject) ; https://msdn.microsoft.com/en-us/library/ms724211(v=vs.85).aspx { if (DllCall("CloseHandle", "ptr", hObject)) return true return false } GetDurationFormatEx(VarIn, Format := "hh:mm:ss.fff") ; https://msdn.microsoft.com/en-us/library/dd318092(v=vs.85).aspx { static LocaleName := "!x-sys-default-locale" if (size := DllCall("GetDurationFormatEx", "ptr", &LocaleName, "uint", 0, "ptr", 0, "int64", VarIn, "str", Format, "ptr", 0, "int", 0)) { VarSetCapacity(buf, size << !!A_IsUnicode, 0) if (DllCall("GetDurationFormatEx", "ptr", &LocaleName, "uint", 0, "ptr", 0, "int64", VarIn, "str", Format, "str", buf, "int", size)) return buf } return false } GetNumberFormatEx(VarIn) ; https://msdn.microsoft.com/en-us/library/dd318113(v=vs.85).aspx { static LocaleName := "!x-sys-default-locale" if (size := DllCall("GetNumberFormatEx", "ptr", &LocaleName, "uint", 0, "ptr", &VarIn, "ptr", 0, "ptr", 0, "int", 0)) { VarSetCapacity(buf, size << 1, 0) if (DllCall("GetNumberFormatEx", "ptr", &LocaleName, "uint", 0, "ptr", &VarIn, "ptr", 0, "str", buf, "int", size)) return SubStr(buf, 1, -3) } return false } GetPerformanceInfo() ; https://msdn.microsoft.com/en-us/library/ms683210(v=vs.85).aspx { static buf, size := NumPut(VarSetCapacity(buf, 8 + (A_PtrSize * 12), 0), buf, "uint") if !(DllCall("GetPerformanceInfo", "ptr", &buf, "uint", size)) if !(DllCall("psapi\GetPerformanceInfo", "ptr", &buf, "uint", size)) return 0 PERFORMANCE_INFORMATION := {} PERFORMANCE_INFORMATION.HandleCount := NumGet(buf, (A_PtrSize * 11), "uint") PERFORMANCE_INFORMATION.ProcessCount := NumGet(buf, (A_PtrSize * 11) + 4, "uint") PERFORMANCE_INFORMATION.ThreadCount := NumGet(buf, (A_PtrSize * 11) + 8, "uint") return PERFORMANCE_INFORMATION } GetProcessMemoryInfo(ProcessID) ; https://msdn.microsoft.com/en-us/library/ms683219(v=vs.85).aspx { static buf, size := NumPut(VarSetCapacity(buf, 8 + (A_PtrSize * 9), 0), buf, "uint") hProcess := this.OpenProcess(ProcessID, 0x0410) if !(DllCall("GetProcessMemoryInfo", "ptr", hProcess, "ptr", &buf, "uint", size)) if !(DllCall("psapi\GetProcessMemoryInfo", "ptr", hProcess, "ptr", &buf, "uint", size)) return 0 PROCESS_MEMORY_COUNTERS_EX := {} PROCESS_MEMORY_COUNTERS_EX.PageFaultCount := NumGet(buf, 4, "uint") PROCESS_MEMORY_COUNTERS_EX.PeakWorkingSetSize := this.GetNumberFormatEx(Round(NumGet(buf, 8, "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.WorkingSetSize := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 1), "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.QuotaPeakPagedPoolUsage := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 2), "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.QuotaPagedPoolUsage := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 3), "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.QuotaPeakNonPagedPoolUsage := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 4), "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.QuotaNonPagedPoolUsage := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 5), "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.PagefileUsage := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 6), "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.PeakPagefileUsage := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 7), "uptr") / 1024)) PROCESS_MEMORY_COUNTERS_EX.PrivateUsage := this.GetNumberFormatEx(Round(NumGet(buf, 8 + (A_PtrSize * 8), "uptr") / 1024)) return PROCESS_MEMORY_COUNTERS_EX, this.CloseHandle(hProcess) } GetTickCount64() ; https://msdn.microsoft.com/en-us/library/ms724411(v=vs.85).aspx { return this.GetDurationFormatEx(DllCall("GetTickCount64", "uint64") * 10000, "d:hh:mm:ss") } GlobalMemoryStatusEx() ; https://msdn.microsoft.com/en-us/library/aa366589(v=vs.85).aspx { static buf, size := NumPut(VarSetCapacity(buf, 64, 0), buf, "uint") if !(DllCall("GlobalMemoryStatusEx", "ptr", &buf)) return 0 MEMORYSTATUSEX := {} MEMORYSTATUSEX.MemoryLoad := NumGet(buf, 4, "uint") MEMORYSTATUSEX.TotalPhys := NumGet(buf, 8, "uint64") MEMORYSTATUSEX.AvailPhys := NumGet(buf, 16, "uint64") MEMORYSTATUSEX.TotalPageFile := NumGet(buf, 24, "uint64") MEMORYSTATUSEX.AvailPageFile := NumGet(buf, 32, "uint64") MEMORYSTATUSEX.TotalVirtual := NumGet(buf, 40, "uint64") MEMORYSTATUSEX.AvailVirtual := NumGet(buf, 48, "uint64") MEMORYSTATUSEX.AvailExtendedVirtual := NumGet(buf, 56, "uint64") return MEMORYSTATUSEX } LookupAccountSid(SID) ; https://msdn.microsoft.com/en-us/library/aa379166(v=vs.85).aspx { DllCall("advapi32\LookupAccountSid", "ptr", 0, "ptr", SID, "ptr", 0, "uint*", SizeName, "ptr", 0, "uint*", SizeDomainName, "uint*", SID_NAME_USE) VarSetCapacity(Name, SizeName << !!A_IsUnicode, 0) VarSetCapacity(DomainName, SizeDomainName << !!A_IsUnicode, 0) if (DllCall("advapi32\LookupAccountSid", "ptr", 0, "ptr", SID, "str", Name, "uint*", SizeName, "str", DomainName, "uint*", SizeDomainName, "uint*", SID_NAME_USE)) return { Name: Name, Domain: DomainName } return false } LookupPrivilegeValue(Privilege) ; https://msdn.microsoft.com/en-us/library/aa379180(v=vs.85).aspx { if (DllCall("advapi32\LookupPrivilegeValue", "ptr", 0, "str", Privilege, "int64*", LUID)) return LUID return false } OpenProcess(ProcessID, Access) ; https://msdn.microsoft.com/en-us/library/ms684320(v=vs.85).aspx { if (hProcess := DllCall("OpenProcess", "uint", Access, "int", 0, "uint", ProcessID, "ptr")) return hProcess return false } OpenProcessToken(hProcess, Access) ; https://msdn.microsoft.com/en-us/library/aa379295(v=vs.85).aspx { if (DllCall("advapi32\OpenProcessToken", "ptr", hProcess, "uint", Access, "ptr*", hToken)) return hToken return false } SetDebugPrivilege() { static PROCESS_QUERY_INFORMATION := 0x0400, TOKEN_ADJUST_PRIVILEGES := 0x0020 if (hProcess := this.OpenProcess(DllCall("GetCurrentProcessId"), PROCESS_QUERY_INFORMATION)) { if (hToken := this.OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES)) { if (LUID := this.LookupPrivilegeValue("SeDebugPrivilege")) { if (this.AdjustTokenPrivileges(hToken, LUID)) return true, this.CloseHandle(hToken) && this.CloseHandle(hProcess) } this.CloseHandle(hToken) } this.CloseHandle(hProcess) } return false } WTSEnumerateProcessesEx() ; https://msdn.microsoft.com/en-us/library/ee621013(v=vs.85).aspx { if (DllCall("wtsapi32\WTSEnumerateProcessesEx", "ptr", 0, "uint*", 1, "uint", 0xFFFFFFFE, "ptr*", buf, "uint*", TTL)) { addr := buf, WTS_PROCESS_INFO_EX := [] loop % TTL { WTS_PROCESS_INFO_EX[A_Index, "SessionId"] := NumGet(addr + 0, "uint") WTS_PROCESS_INFO_EX[A_Index, "ProcessId"] := NumGet(addr + 4, "uint") WTS_PROCESS_INFO_EX[A_Index, "ProcessName"] := StrGet(NumGet(addr + 8, "ptr")) WTS_PROCESS_INFO_EX[A_Index, "UserSid"] := SID := NumGet(addr + 8 + (A_PtrSize), "ptr") LAS := this.LookupAccountSid(SID) WTS_PROCESS_INFO_EX[A_Index, "UserName"] := Las.Name WTS_PROCESS_INFO_EX[A_Index, "DomainName"] := Las.Domain WTS_PROCESS_INFO_EX[A_Index, "NumberOfThreads"] := NumGet(addr + 8 + (A_PtrSize * 2), "uint") WTS_PROCESS_INFO_EX[A_Index, "HandleCount"] := NumGet(addr + 12 + (A_PtrSize * 2), "uint") WTS_PROCESS_INFO_EX[A_Index, "PagefileUsage"] := this.GetNumberFormatEx(Round(NumGet(addr + 16 + (A_PtrSize * 2), "uint") / 1024)) WTS_PROCESS_INFO_EX[A_Index, "PeakPagefileUsage"] := this.GetNumberFormatEx(Round(NumGet(addr + 20 + (A_PtrSize * 2), "uint") / 1024)) WTS_PROCESS_INFO_EX[A_Index, "WorkingSetSize"] := this.GetNumberFormatEx(Round(NumGet(addr + 24 + (A_PtrSize * 2), "uint") / 1024)) WTS_PROCESS_INFO_EX[A_Index, "PeakWorkingSetSize"] := this.GetNumberFormatEx(Round(NumGet(addr + 28 + (A_PtrSize * 2), "uint") / 1024)) WTS_PROCESS_INFO_EX[A_Index, "UserTime"] := this.GetDurationFormatEx(NumGet(addr + 32 + (A_PtrSize * 2), "int64")) WTS_PROCESS_INFO_EX[A_Index, "KernelTime"] := this.GetDurationFormatEx(NumGet(addr + 40 + (A_PtrSize * 2), "int64")) addr += 48 + (A_PtrSize * 2) } return WTS_PROCESS_INFO_EX, this.WTSFreeMemoryEx(buf, TTL) } return false } WTSFreeMemoryEx(Memory, NumberOfEntries) ; https://msdn.microsoft.com/en-us/library/ee621015(v=vs.85).aspx { static WTS_TYPE_CLASS := 1 if (DllCall("wtsapi32\WTSFreeMemoryEx", "int", WTS_TYPE_CLASS, "ptr", Memory, "uint", NumberOfEntries)) return true return false } __Delete() { if (this.hWTSAPI) DllCall("FreeLibrary", "ptr", this.hWTSAPI) if (this.hPSAPI) DllCall("FreeLibrary", "ptr", this.hPSAPI) if (this.hNTDLL) DllCall("FreeLibrary", "ptr", this.hNTDLL) if (this.hADVAPI) DllCall("FreeLibrary", "ptr", this.hADVAPI) } }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)