class TaskMonitorPlus(eg.PluginBase): def __init__(self): self.AddEvents() def __start__(self, *dummyArgs): self.pids, self.hwnds = EnumProcesses() self.flashing = set() self.lastActivated = None eg.messageReceiver.AddHandler(WM_APP + 1, self.WindowGotFocusProc) eg.messageReceiver.AddHandler(WM_APP + 2, self.WindowCreatedProc) eg.messageReceiver.AddHandler(WM_APP + 3, self.WindowDestroyedProc) eg.messageReceiver.AddHandler(WM_SHELLHOOKMESSAGE, self.MyWndProc) RegisterShellHookWindow(eg.messageReceiver.hwnd) self.hookDll = CDLL(abspath(join(dirname(__file__), "TaskHook.dll"))) #self.hookDll = CDLL(abspath(join(eg.corePluginDir, "Task", "TaskHook.dll"))) self.hookDll.StartHook() trayWindow = 0 for explorerPid in [ x for x in self.pids if self.pids[x].name == "explorer" ]: for hwnd in self.pids[explorerPid].hwnds: if GetClassName(hwnd) == "Shell_TrayWnd": trayWindow = hwnd break if trayWindow != 0: break self.desktopHwnds = (GetShellWindow(), trayWindow) def __stop__(self): self.hookDll.StopHook() FreeLibrary(self.hookDll._handle) DeregisterShellHookWindow(eg.messageReceiver.hwnd) eg.messageReceiver.RemoveHandler(WM_SHELLHOOKMESSAGE, self.MyWndProc) eg.messageReceiver.RemoveHandler(WM_APP + 1, self.WindowGotFocusProc) eg.messageReceiver.RemoveHandler(WM_APP + 2, self.WindowCreatedProc) eg.messageReceiver.RemoveHandler(WM_APP + 3, self.WindowDestroyedProc) def CheckWindow(self, hwnd): hwnd2 = GetAncestor(hwnd, GA_ROOT) if hwnd == 0 or hwnd2 in self.desktopHwnds: return #"Desktop", 0, None if hwnd != hwnd2: return if GetWindowLong(hwnd, GWL_HWNDPARENT): return if not IsWindowVisible(hwnd): return if hwnd in self.hwnds: processInfo = self.pids.get(self.hwnds[hwnd].pid, None) return processInfo pid = GetWindowPid(hwnd) processInfo = self.pids.get(pid, None) if not processInfo: processInfo = ProcessInfo(pid) self.pids[pid] = processInfo self.TriggerEvent("Created." + processInfo.name) processInfo.hwnds[hwnd] = WindowInfo(hwnd) self.hwnds[hwnd] = processInfo self.TriggerEvent("NewWindow." + processInfo.name, processInfo.hwnds[hwnd]) return processInfo def MyWndProc(self, dummyHwnd, dummyMesg, wParam, lParam): if wParam == HSHELL_WINDOWDESTROYED: self.WindowDestroyedProc(None, None, lParam, None) elif wParam in (HSHELL_WINDOWACTIVATED, HSHELL_WINDOWCREATED, 0x8004): self.WindowGotFocusProc(None, None, lParam, None) elif wParam == 0x8006: self.WindowFlashedProc(None, None, lParam, None) return 1 def WindowCreatedProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): self.CheckWindow(hwnd) def WindowDestroyedProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): #hwnd2 = GetAncestor(hwnd, GA_ROOT) processInfo = self.hwnds.get(hwnd, None) if processInfo: winDetails = processInfo.hwnds[hwnd] del processInfo.hwnds[hwnd] del self.hwnds[hwnd] pid = processInfo.pid if hwnd == self.lastActivated: self.TriggerEvent("Deactivated." + processInfo.name, winDetails) self.lastActivated = None self.TriggerEvent("ClosedWindow." + processInfo.name, winDetails) if len(processInfo.hwnds) == 0: self.TriggerEvent("Destroyed." + processInfo.name) self.pids.pop(pid, None) def WindowFlashedProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): processInfo = self.hwnds.get(hwnd, None) if processInfo and hwnd not in self.flashing: self.flashing.add(hwnd) self.TriggerEvent("Flashed." + processInfo.name, processInfo.hwnds[hwnd]) def WindowGotFocusProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): thisProcessInfo = self.CheckWindow(hwnd) if thisProcessInfo and hwnd != self.lastActivated: if hwnd in self.flashing: self.flashing.remove(hwnd) if self.lastActivated: lastProcessInfo = self.hwnds.get(self.lastActivated, None) payload = None if lastProcessInfo: payload = lastProcessInfo.hwnds[self.lastActivated] self.TriggerEvent("Deactivated." + lastProcessInfo.name, payload) self.TriggerEvent("Activated." + thisProcessInfo.name, thisProcessInfo.hwnds[hwnd]) self.lastActivated = hwnd
class Task(eg.PluginBase): def __init__(self): self.AddEvents() def __start__(self, *dummyArgs): self.names, self.hwnds = EnumProcesses() self.flashing = set() self.lastActivated = None eg.messageReceiver.AddHandler(WM_APP + 1, self.WindowGotFocusProc) eg.messageReceiver.AddHandler(WM_APP + 2, self.WindowCreatedProc) eg.messageReceiver.AddHandler(WM_APP + 3, self.WindowDestroyedProc) eg.messageReceiver.AddHandler(WM_SHELLHOOKMESSAGE, self.MyWndProc) RegisterShellHookWindow(eg.messageReceiver.hwnd) self.hookDll = CDLL(abspath(join(dirname(__file__), "TaskHook.dll"))) self.hookDll.StartHook() trayWindow = 0 if "explorer" in self.names: for hwnd in self.names["explorer"].hwnds: if GetClassName(hwnd) == "Shell_TrayWnd": trayWindow = hwnd break self.desktopHwnds = (GetShellWindow(), trayWindow) def __stop__(self): self.hookDll.StopHook() FreeLibrary(self.hookDll._handle) DeregisterShellHookWindow(eg.messageReceiver.hwnd) eg.messageReceiver.RemoveHandler(WM_SHELLHOOKMESSAGE, self.MyWndProc) eg.messageReceiver.RemoveHandler(WM_APP + 1, self.WindowGotFocusProc) eg.messageReceiver.RemoveHandler(WM_APP + 2, self.WindowCreatedProc) eg.messageReceiver.RemoveHandler(WM_APP + 3, self.WindowDestroyedProc) def CheckWindow(self, hwnd): hwnd2 = GetAncestor(hwnd, GA_ROOT) if hwnd == 0 or hwnd2 in self.desktopHwnds: return "Desktop", 0 if hwnd != hwnd2: return if GetWindowLong(hwnd, GWL_HWNDPARENT): return if not IsWindowVisible(hwnd): return if hwnd in self.hwnds: return self.hwnds[hwnd].name, hwnd pid = GetWindowPid(hwnd) name = splitext(GetProcessName(pid))[0] processInfo = self.names.get(name, None) if not processInfo: processInfo = ProcessInfo(name) self.names[name] = processInfo self.TriggerEvent("Created." + name) processInfo.hwnds.add(hwnd) self.hwnds[hwnd] = processInfo self.TriggerEvent("NewWindow." + name) return name, hwnd def MyWndProc(self, dummyHwnd, dummyMesg, wParam, lParam): if wParam == HSHELL_WINDOWDESTROYED: self.WindowDestroyedProc(None, None, lParam, None) elif wParam in (HSHELL_WINDOWACTIVATED, HSHELL_WINDOWCREATED, 0x8004): self.WindowGotFocusProc(None, None, lParam, None) elif wParam == 0x8006: self.WindowFlashedProc(None, None, lParam, None) return 1 def WindowCreatedProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): self.CheckWindow(hwnd) def WindowDestroyedProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): #hwnd2 = GetAncestor(hwnd, GA_ROOT) processInfo = self.hwnds.get(hwnd, None) if processInfo: processInfo.hwnds.remove(hwnd) del self.hwnds[hwnd] name = processInfo.name if (name, hwnd) == self.lastActivated: self.TriggerEvent("Deactivated." + name) self.lastActivated = None self.TriggerEvent("ClosedWindow." + name) if len(processInfo.hwnds) == 0: self.TriggerEvent("Destroyed." + name) self.names.pop(name, None) def WindowFlashedProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): processInfo = self.hwnds.get(hwnd, None) if processInfo and hwnd not in self.flashing: self.flashing.add(hwnd) self.TriggerEvent("Flashed." + processInfo.name) def WindowGotFocusProc(self, dummyHwnd, dummyMesg, hwnd, dummyLParam): ident = self.CheckWindow(hwnd) if ident and ident != self.lastActivated: if hwnd in self.flashing: self.flashing.remove(hwnd) if self.lastActivated: self.TriggerEvent("Deactivated." + self.lastActivated[0]) self.TriggerEvent("Activated." + ident[0]) self.lastActivated = ident