【问题标题】:Get Application Name from .exe file in python从python中的.exe文件获取应用程序名称
【发布时间】:2015-06-29 14:53:49
【问题描述】:

我正在使用下面的代码获取当前活动的窗口标题和 exe 文件路径

hwnd = win32gui.GetForegroundWindow()
    _, pid = win32process.GetWindowThreadProcessId(hwnd)
    if hwnd != 0 or pid != 0:
        try:
            hndl =     win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ, 0, pid)
            self.newExe = win32process.GetModuleFileNameEx(hndl, 0)
            self.newWindowTitle = win32gui.GetWindowText(hwnd)
        except:
            self.newExe = ''
            self.newWindowTitle = ''

问题在于,尽管经常如此,但窗口标题并不总是应用程序名称(用户理解为应用程序主要部分的名称),这正是我所需要的。例如从 calc.exe 获取计算器而不依赖于窗口标题。

目的是创建一个脚本,该脚本将登录一个 xml 比较使用计算机上的任何软件

这可能吗?

【问题讨论】:

  • 首先你需要定义“应用程序名称”。
  • 在这种情况下,它意味着用户知道应用程序的名称。例如 chrome.exe -> 谷歌浏览器
  • 在这种情况下,您所要求的通常是不可能的。可执行文件没有先验理由将其官方产品名称包含在一个明确定义的位置。
  • 有没有办法将 exe 与计算机上正在运行的程序列表进行比较,并从系统中获取有关该软件的信息?
  • 你到底想做什么?我想您能做的最好的事情就是从可执行文件中读取版本信息资源并报告FileDescription 字段。这就是 Process Explorer 等工具的作用。

标签: python winapi pywin


【解决方案1】:

大多数 Windows 应用程序在其资源表中存储诸如此类的信息。可以使用 API 调用来提取它。

以下内容从给定应用程序中提取文件描述:

import win32api

def getFileDescription(windows_exe):
    try:
        language, codepage = win32api.GetFileVersionInfo(windows_exe, '\\VarFileInfo\\Translation')[0]
        stringFileInfo = u'\\StringFileInfo\\%04X%04X\\%s' % (language, codepage, "FileDescription")
        description = win32api.GetFileVersionInfo(windows_exe, stringFileInfo)
    except:
        description = "unknown"
        
    return description
    
    
print(getFileDescription(r"C:\Program Files\Internet Explorer\iexplore.exe"))

输出是:

Internet Explorer

因此,您可以将调用 win32process.GetModuleFileNameEx() 的结果传递给此函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 2011-08-21
    相关资源
    最近更新 更多