有没有一种方法可以通过只提供可执行文件的路径或名称来从特定窗口获取hwnd-object?类似于win32gui中的GetForegroundWindow(),但不仅仅是前台窗口。我会想象这样的事情:GetWindowByPath("C:/mypath/Spotify.exe")或GetWindowByName("Spotify")。也许是ahk?(我对AHK没有任何了解)我现在已经读了几个小时的其他问题和文档,还没有找到一个方法。提前感谢:)
win32gui
GetForegroundWindow()
GetWindowByPath("C:/mypath/Spotify.exe")
GetWindowByName("Spotify")
mrwjdhj31#
没有直接的方法,你需要从两端接近它,并在中间相遇,这是进程ID。如果这是本机代码,则可以使用Toolhelp函数枚举所有进程并查看每个进程的文件名。找到匹配项时,请记住进程ID。然后调用EnumWindows来查找所有顶层窗口。在回调函数中,你会在每个窗口上调用GetWindowThreadProcessId,直到你找到一个与你之前找到的进程id匹配的窗口。
EnumWindows
GetWindowThreadProcessId
vfwfrxfs2#
下面是一个示例代码,用于在给定exe路径时获取hwnd的列表。
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做你想做的事情。
2条答案
按热度按时间mrwjdhj31#
没有直接的方法,你需要从两端接近它,并在中间相遇,这是进程ID。
如果这是本机代码,则可以使用Toolhelp函数枚举所有进程并查看每个进程的文件名。找到匹配项时,请记住进程ID。
然后调用
EnumWindows
来查找所有顶层窗口。在回调函数中,你会在每个窗口上调用GetWindowThreadProcessId
,直到你找到一个与你之前找到的进程id匹配的窗口。vfwfrxfs2#
下面是一个示例代码,用于在给定exe路径时获取
hwnd
的列表。用法和输出示例:
然后你就可以使用hwnds做你想做的事情。