win32gui получает имя текущего активного приложения

Я только изучаю питон, и я новичок в теории относительности. Я создал следующий скрипт, который получит текущий заголовок активного окна и распечатает его в окне.

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

Приведенный выше фрагмент кода работает. Я сейчас пытаюсь получить имя приложения для активного окна (Foreground Window)

У меня вопрос:

  • Как получить имя активного приложения Windows на переднем плане в Python?

Изменить

Например: если пользователь переключается с калькулятора (calc.exe) на Google Chrome (chrome.exe), я хочу увидеть, как называется приложение, на которое он переключился. Проблема с заголовком заключается в том, что не все приложения добавляют к заголовку имя приложения. Например, Google Chrome помещает заголовок страницы как заголовок окна. Я хочу знать, как называется приложение, на которое переключился пользователь.

calc.exe
chrome.exe

person Steven Smethurst    schedule 18.01.2013    source источник
comment
Вам необходимо определить, что вы подразумеваете под названием приложения   -  person David Heffernan    schedule 18.01.2013
comment
@DavidHeffernan Обновил вопрос.   -  person Steven Smethurst    schedule 18.01.2013
comment
Это все еще не совсем понятно. Вы ищете имя, содержащееся в ресурсе VERSIONINFO исполняемого файла, которому принадлежит окно?   -  person David Heffernan    schedule 18.01.2013
comment
Если вы хотите узнать имя запущенного исполняемого файла, попробуйте использовать библиотеку psutil. Я успешно перечислил процессы и получил имена исполняемых файлов с помощью этой техники. Единственная проблема заключается в том, что может быть трудно получить процесс переднего плана или сопоставить процесс с заголовком найденного вами окна переднего плана.   -  person trevorKirkby    schedule 02.01.2014


Ответы (2)


Сначала установите WMI пакет (и pywin32 причины):

pip install wmi

Потом:

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
person Answeror    schedule 20.02.2013

Думаю, это поможет

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()

при условии, что вы установили модули psutil и win32

Запустите эту программу, чтобы лучше понять

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()
person Mike Shane    schedule 22.12.2017