win32gui get the current active application name

12,155

Solution 1

Install WMI package first (and pywin32 of cause):

pip install wmi

Then:

import win32process
import wmi


c = wmi.WMI()


def get_app_path(hwnd):
    """Get applicatin path given hwnd."""
    try:
        _, pid = win32process.GetWindowThreadProcessId(hwnd)
        for p in c.query('SELECT ExecutablePath FROM Win32_Process WHERE ProcessId = %s' % str(pid)):
            exe = p.ExecutablePath
            break
    except:
        return None
    else:
        return exe


def get_app_name(hwnd):
    """Get applicatin filename given hwnd."""
    try:
        _, pid = win32process.GetWindowThreadProcessId(hwnd)
        for p in c.query('SELECT Name FROM Win32_Process WHERE ProcessId = %s' % str(pid)):
            exe = p.Name
            break
    except:
        return None
    else:
        return exe

Solution 2

Think this will do the trick

import psutil, win32process, win32gui, time
def active_window_process_name():
    pid = win32process.GetWindowThreadProcessId(win32gui.GetForegroundWindow()) #This produces a list of PIDs active window relates to
    print(psutil.Process(pid[-1]).name()) #pid[-1] is the most likely to survive last longer


time.sleep(3) #click on a window you like and wait 3 seconds 
active_window_process_name()

assuming you have installed psutil and win32 modules

Run this program to get a better understanding

import threading, win32gui, win32process, psutil
from tkinter import *
root = Tk()
s = StringVar()
def active_window_process_name():
    try:
        pid = win32process.GetWindowThreadProcessId(win32gui.GetForegroundWindow())
        return(psutil.Process(pid[-1]).name())
    except:
        pass
def to_label():
    global s
    while True:
        s.set(active_window_process_name())
    return

Label(root,textvariable=s).pack()
if __name__ == "__main__":
    t = threading.Thread(target = to_label)
    t.start()
    root.mainloop()
Share:
12,155
Steven Smethurst
Author by

Steven Smethurst

CTO at Chipkin Automation System https://store.chipkin.com/ Personal projects can be found on my blog https://blog.abluestar.com/

Updated on July 19, 2022

Comments

  • Steven Smethurst
    Steven Smethurst almost 2 years

    I am just learning python and I am relativity new to it. I created the following script that will get the current active windows title and print it to the window.

    import win32gui
    windowTile = ""; 
    while ( True ) :
        newWindowTile = win32gui.GetWindowText (win32gui.GetForegroundWindow());        
        if( newWindowTile != windowTile ) :
            windowTile = newWindowTile ; 
            print( windowTile ); 
    

    The above code snippet works. I am now trying to get the application name for the active window (Foreground Window)

    My question is:

    • How do you get the foreground active windows application name in python?

    Edit

    For example: If a user switches from a Calculator (calc.exe) to Google Chrome (chrome.exe) I want to see what the application that they switched to is called. The problem with the title is that not all applications prefix the title with the application name. For example google chrome puts the page title as the window title. I want to know what the application that the user switched to is called.

    calc.exe
    chrome.exe
    
  • mythofechelon
    mythofechelon almost 2 years
    try-except is definitely needed. It throws errors quite often.