【问题标题】:wxPython - Get existing windowDC/handle using wx python module?wxPython - 使用 wx python 模块获取现有的 windowDC/句柄?
【发布时间】:2013-11-15 00:41:57
【问题描述】:

我一直在研究在 Windows 7 上使用 wx python 包。具体来说,我希望能够获取现有窗口的图像数据(即不是由 python 程序打开的窗口)。看来我可以通过获取窗口的设备上下文、创建兼容的设备上下文、复制位图,然后从那里以我喜欢的方式使用它来做到这一点。问题是我似乎找不到获取现有窗口的设备上下文(或句柄)的方法。我只看到使用 wx 创建的 python 程序从 windows 获取它们的方法。我怎么能这样做呢?非常感谢!

【问题讨论】:

    标签: python python-2.7 wxpython wxwidgets


    【解决方案1】:

    wx 可能没有办法做到这一点。

    您需要的 Windows API 非常简单,您可以通过win32api(或ctypes,如果您愿意,但工作量更大)来使用它们。

    首先,我不知道您打算如何识别所需的窗口。如果您有它的类和名称,您可以只使用FindWindow(或者,如果它可能不是顶级窗口,则使用FindWindowEx)。如果您想通过其他方式进行搜索,您可能需要调用EnumWindow(如果您不确定它是否是顶级窗口,则递归调用EnumChildWindows)。

    此时,您只需调用wx.Windows.AssociateHandlewx.Window 对象附加到HWND。

    如果您出于某种原因不能这样做,GetDC 会为您提供 HWND 的显示上下文。然后,您可以创建一个内存 DC,或者在 wx 窗口下获取本机窗口的 DC,并从一个到另一个 BitBlt

    【讨论】:

    • AssociateHandle 确实可以用于在 Python 应用程序之外创建的窗口。
    • @FogleBird:谢谢!让我编辑答案,因为这样会让事情变得更简单。
    • 好的。我在想这可能是这样的。我正在尝试按照您的建议进行操作,但在am looking for in this question 时遇到了问题。但是,我没有在那里找到解决方案,而且我自己也很难找到解决方案。那是我找到 wx 并认为它可能是一个解决方案的时候。
    • 哦!也许使用 AssociateHandle 的更新对我有用。谢谢!
    【解决方案2】:

    只是为了扩展另一个答案,试试这个代码(未经测试,我现在不在 Windows 上)...

    # first use FindWindow or FindWindowEx to determine window handle
    frame = wx.Frame(None)
    frame.AssociateHandle(handle)
    dc = wx.ClientDC(frame)
    width, height = dc.GetSize()
    bitmap = wx.EmptyBitmap(width, height)
    mdc = wx.MemoryDC(bitmap)
    mdc.Blit(0, 0, width, height, dc, 0, 0)
    del mdc
    bitmap.SaveFile('output.png', wx.BITMAP_TYPE_PNG)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多