【问题标题】:How to get the image of a window when we only know its window handle当我们只知道它的窗口句柄时如何获取窗口的图像
【发布时间】:2014-03-20 17:22:57
【问题描述】:

我正在用 C# 开发一个应用程序,并且想知道如何在我们只知道其窗口句柄的情况下获取任何窗口的屏幕截图图像。我想要实现的功能是当我只知道它的窗口句柄时,能够只复制任何窗口的屏幕截图(它可以是整个应用程序或应用程序内的控件)。

示例:我正在运行一个计算器应用程序和 Spy++。当我使用 Spy++ 的查找窗口功能并将鼠标悬停在计算器的不同按钮上时,它会显示不同的窗口句柄。假设我将鼠标悬停在计算器中的“9”按钮上。现在我知道它的窗口句柄,我只想获取“9”按钮的图像。如果我有完整应用程序的窗口句柄,那么我希望能够只获取该应用程序的屏幕截图。类似于 Alt+PrintScr。

【问题讨论】:

    标签: c# screenshot window-handles


    【解决方案1】:

    您需要使用GetWindowRect

    就像this example 中所示。

    然后你可以使用Graphics.CopyFromScreen,如这篇SO帖子c# Take a screenshot of specific area所示。

    把它们放在一起,你调用 GetWindowRect,它接受一个 HWnd 来获取你想要的窗口的矩形。然后,您将这些 rect 值与 CopyFromScreen 一起使用来捕获您的图像。

    【讨论】:

    • 我尝试了这种技术,但有一个问题,拍摄的图像只是屏幕截图。它不是窗口的图像。如果窗口完全可见,它工作正常,但如果窗口隐藏(完全,甚至部分)在另一个应用程序后面,它就不起作用。有没有什么方法可以获取窗口的图像,即使它们没有完全显示在屏幕上?
    • 如果它没有出现在屏幕上,那么它可能没有被绘制,这意味着你没有任何东西可以复制。我唯一的建议是激活窗口,将其完全移动到可视区域,捕获图像,然后将其移回并将焦点返回到之前处于活动状态的任何内容。它可能会导致一点闪烁,但我不知道有什么其他方法......也许你应该问一个新问题。
    • 我会试试这个,但我认为闪烁会是一个问题,因为我会在我的应用程序中经常这样做。我要问一个新问题,让我们看看是否有人有更好的解决方案。
    • 来晚了,但这里有解决方案User32.PrintWindow
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2010-09-13
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多