如何使用 pywin32 在 Python 中获取特定应用程序窗口的句柄?

Posted

技术标签:

【中文标题】如何使用 pywin32 在 Python 中获取特定应用程序窗口的句柄?【英文标题】:How to get handle for a specific application window in Python using pywin32? 【发布时间】:2020-04-11 03:35:55 【问题描述】:

我正在尝试修改一些 Python 代码,以在 Windows 10 中截取特定应用程序窗口的屏幕截图。为此,我正在尝试使用 pywin32 包中的 win32ui / win32gui 模块。这是损坏的代码:

def getWindow():
    name = "Windows PowerShell"
    window = win32ui.FindWindow(None, name)
    windowDC = win32gui.GetWindowDC(window)

最后一行导致错误。以下是控制台输出的相关部分:

  File ".\fake_file_name.py", line 9, in getWindow
    windowDC = win32gui.GetWindowDC(window)
TypeError: The object is not a PyHANDLE object

我对 Python 的类型系统或错误消息不是很熟悉,但是这个错误使 GetWindowDC 看起来像是在期待一个类型为 PyHANDLE 的参数。 The documentation 我可以找到 win32gui.FindWindow 使它看起来像 PyHANDLE 确实是输出类型。

另一方面,这些非常相似的代码行来自一个确实工作的函数:

    hwin = win32gui.GetDesktopWindow()
    hwindc = win32gui.GetWindowDC(hwin)

这是doc page 的win32gui.GetDesktopWindow。如果前面显示的错误消息没有特别提到PyHANDLE,我会假设FindWindowGetDesktopWindow 返回不同且不兼容的类型。

谁能帮我理解这条错误消息的含义以及它出现的原因?我也会对获取名为“Windows Powershell”的窗口的设备上下文的示例代码感兴趣,就像我的损坏代码试图做的那样。

其他信息: Documentation page 为win32gui.GetWindowDC

【问题讨论】:

【参考方案1】:

您可以使用EnumWindows(),这将搜索所有窗口,在MSDN doc中阅读:

import win32gui

def getShell():
    thelist = []
    def findit(hwnd,ctx):
        if win32gui.GetWindowText(hwnd) == "Windows PowerShell": # check the title
            thelist.append(hwnd)

    win32gui.EnumWindows(findit,None)
    return thelist

b = getShell()
print(b) # b is the list of hwnd,contains those windows title is "Windows PowerShell"

【讨论】:

谢谢,经过一些小调整后,我能够使用win32gui.GetWindowDC 插入您的函数输出。

以上是关于如何使用 pywin32 在 Python 中获取特定应用程序窗口的句柄?的主要内容,如果未能解决你的问题,请参考以下文章

python 使用WMI和pywin32获取窗口温度区域

如何在 C++ 代码中使用 pywin32 函数?

如果某个任务正在任务管理器中运行,我如何在 python 中使用 pywin 或 win32com.client 检查?

python如何设置按键松开

如何使用 pywin32 静音/取消静音?

Pywinauto常用02--pywin32(Python调用win api)