From 53be721b343cc43fd0ec3556feac07e4719261aa Mon Sep 17 00:00:00 2001 From: Kalmat Date: Sat, 5 Mar 2022 20:30:11 +0100 Subject: [PATCH] Added getAllApps() and getAllAppsWindows() methods --- README.md | 6 ++-- dist/PyWinCtl-0.0.23-py3-none-any.whl | Bin 37830 -> 38225 bytes src/pywinctl/_pywinctl_linux.py | 18 ++++++++++ src/pywinctl/_pywinctl_win.py | 48 +++++++++++++++++++++++--- 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index fb5f2fb..46c78fd 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ All these functions are available at the moment, in all three platforms (Windows | getMousePos | activate | | | getScreenSize | resize / resizeRel | | | getWorkArea | resizeTo | | -| version | move / moveRel | | -| | moveTo | | -| | alwaysOnTop | | +| getAllApps | move / moveRel | | +| getAllAppsWindows | moveTo | | +| version | alwaysOnTop | | | | alwaysOnBottom | | | | lowerWindow | | | | raiseWindow | | diff --git a/dist/PyWinCtl-0.0.23-py3-none-any.whl b/dist/PyWinCtl-0.0.23-py3-none-any.whl index 08ac6cfb495269595c0de82eaade8dbe1bcde326..f0a3374eb8a331d0baa61a288cf0cc1d6cc8be5a 100644 GIT binary patch delta 18111 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 diff --git a/src/pywinctl/_pywinctl_linux.py b/src/pywinctl/_pywinctl_linux.py index af0357c..28856b3 100644 --- a/src/pywinctl/_pywinctl_linux.py +++ b/src/pywinctl/_pywinctl_linux.py @@ -6,6 +6,7 @@ import subprocess import sys import time +import timeit from typing import Union, List import Xlib.X @@ -140,6 +141,23 @@ def findit(hwnd): return matches +def getAllApps(): + """Returns a list of all active apps.""" + return list(getAllAppsWindows().keys()) + + +def getAllAppsWindows(): + """Returns a list of all active apps and their open windows.""" + result = {} + for win in getAllWindows(): + appName = win.getAppName() + if appName in result.keys(): + result[appName].append(win.title) + else: + result[appName] = [win.title] + return result + + class LinuxWindow(BaseWindow): def __init__(self, hWnd: Union[Cursor, Drawable, Pixmap, Resource, Fontable, Window, GC, Colormap, Font]): diff --git a/src/pywinctl/_pywinctl_win.py b/src/pywinctl/_pywinctl_win.py index 92174e1..bcd6d07 100644 --- a/src/pywinctl/_pywinctl_win.py +++ b/src/pywinctl/_pywinctl_win.py @@ -5,6 +5,7 @@ import sys import time import threading +import timeit from typing import List import win32api @@ -105,6 +106,44 @@ def enum_windows(handle: int, h_list: list): return [] +def _getAllApps(tryToFilter=False): + # https://stackoverflow.com/questions/550653/cross-platform-way-to-get-pids-by-process-name-in-python + WMI = GetObject('winmgmts:') + processes = WMI.InstancesOf('Win32_Process') + process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value, p.Properties_("CommandLine").Value) for p in processes] + if tryToFilter: + # Trying to figure out how to identify user-apps (non-system apps). Commandline property seems to partially work + matches = [] + for item in process_list: + if item[2]: + matches.append(item) + process_list = matches + return process_list + + +def getAllApps(): + """Returns a list of all active apps.""" + return list(getAllAppsWindows().keys()) + + +def getAllAppsWindows(): + """Returns a list of all active apps and their open windows.""" + process_list = _getAllApps(tryToFilter=True) + result = {} + for win in getAllWindows(): + pID = win32process.GetWindowThreadProcessId(win.getHandle()) + for item in process_list: + appPID = item[0] + appName = item[1] + if appPID == pID[1]: + if appName in result.keys(): + result[appName].append(win.title) + else: + result[appName] = [win.title] + break + return result + + class Win32Window(BaseWindow): def __init__(self, hWnd: int): super().__init__() @@ -321,12 +360,11 @@ def getAppName(self) -> int: processes = WMI.InstancesOf('Win32_Process') process_list = [(p.Properties_("ProcessID").Value, p.Properties_("Name").Value) for p in processes] pID = win32process.GetWindowThreadProcessId(self._hWnd) + pID = pID[1] name = "" - if len(pID) > 1: - pID = pID[1] - for item in process_list: - if item[0] == pID: - name = item[1] + for item in process_list: + if item[0] == pID: + name = item[1] return name def getParent(self) -> int: