python 如何通过可执行文件路径或名称获取窗口句柄(hwnd)?

wwwo4jvm  于 2023-09-29  发布在  Python
关注(0)|答案(2)|浏览(117)

有没有一种方法可以通过只提供可执行文件的路径或名称来从特定窗口获取hwnd-object?
类似于win32gui中的GetForegroundWindow(),但不仅仅是前台窗口。
我会想象这样的事情:GetWindowByPath("C:/mypath/Spotify.exe")GetWindowByName("Spotify")。也许是ahk?(我对AHK没有任何了解)
我现在已经读了几个小时的其他问题和文档,还没有找到一个方法。提前感谢:)

mrwjdhj3

mrwjdhj31#

没有直接的方法,你需要从两端接近它,并在中间相遇,这是进程ID。
如果这是本机代码,则可以使用Toolhelp函数枚举所有进程并查看每个进程的文件名。找到匹配项时,请记住进程ID。
然后调用EnumWindows来查找所有顶层窗口。在回调函数中,你会在每个窗口上调用GetWindowThreadProcessId,直到你找到一个与你之前找到的进程id匹配的窗口。

vfwfrxfs

vfwfrxfs2#

下面是一个示例代码,用于在给定exe路径时获取hwnd的列表。

import win32gui
import win32process
import psutil

def GetHwndByPath(path):
    hwnd_list = []

    def winEnumHandler(hwnd, ctx):
        if win32gui.IsWindowVisible(hwnd):
            thread_id, process_id = win32process.GetWindowThreadProcessId(hwnd)
            # Get the process name and executable path
            process = psutil.Process(process_id)
            process_name = process.name()
            process_path = process.exe()
            if process_path == path:
                hwnd_list.append(hwnd)

    win32gui.EnumWindows(winEnumHandler, None)
    return hwnd_list

用法和输出示例:

print(GetHwndByPath("C:\Program Files\DAUM\PotPlayer\PotPlayerMini64.exe"))

# output:
[24389654, 27541266, 22546206]

然后你就可以使用hwnds做你想做的事情。

相关问题