2013-01-18 113 views
3

我只是在学习python,而我是相对性的新手。 我创建了以下脚本,它将获取当前活动的窗口标题并将其打印到窗口。win32gui获取当前活动的应用程序名称

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

上面的代码片段的作品。我不是想为活动窗口获取应用程序的名称(Foreground Window

我的问题是:

  • 你如何在python前台运行Windows应用程序的名称?

编辑

例如:如果从计算器(CALC.EXE)用户切换到谷歌浏览器(的chrome.exe)我想看看他们切换应用程序被调用。标题的问题在于并非所有应用程序都将标题与应用程序名称相加。例如谷歌浏览器将页面标题作为窗口标题。我想知道用户切换到的应用程序是什么。

calc.exe 
chrome.exe 
+0

您需要定义你所说的“应用程序名称” –

+0

@DavidHeffernan更新的问题是什么意思。 –

+0

这还不完全清楚。您是否正在寻找拥有该窗口的可执行文件的VERSIONINFO资源中包含的名称? –

回答

3

安装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 
0

想到这会做的伎俩

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

假设你有安装psutilwin32模块

运行此程序,以更好地了解

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() 
相关问题