【问题标题】:How to exactly copy what you see on your screen?如何准确复制您在屏幕上看到的内容?
【发布时间】:2020-09-21 23:25:33
【问题描述】:

所以我搜索了一段时间关于如何复制屏幕上的内容或截屏,我找到了一些解决方案,例如这种方法:

public static Bitmap TakeScreenshot()
{
  Bitmap newImg = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
  Graphics graphics = Graphics.FromImage(newImg as Image);
  graphics.CopyFromScreen(0, 0, 0, 0, newImg.Size);
  return newImg;
}

这个方法很好用,只是当你以管理员身份运行应用程序时,屏幕会显示类似“Are you sure? YES NO”:

甚至在 CTRL + ALT + DEL 上:

在这些屏幕上,这些方法不起作用,因为它们会显示黑屏,此外,某些应用程序会在它们上显示黑屏,因为它们就像受保护/不在您的屏幕上一样屏幕上的其他东西正常显示。

为什么会这样?以及如何准确地看到我在屏幕上看到的内容?

编辑#1:

使用 PsExec 找到解决方案。 (感谢 Koray Elbek)

但仍然没有解决某些应用程序发生的问题,因为它们上面会有一个这样的黑框:

为什么会发生这种情况以及如何获得正确的屏幕截图?

【问题讨论】:

    标签: c# copy screen screenshot


    【解决方案1】:

    以下引用来自here

    登录屏幕是一个独立的桌面,在 NT_AUTHORITY\SYSTEM 您无权访问。能够使用图形用户界面 在这样的私人环境中,有一些捷径,比如this, 但最终的工具是PsExec 它使用服务助手来运行 远程机器上的程序,或本地机器上的程序 NT_AUTHORITY\SYSTEM。助手服务打开一个命名管道 与本地应用程序通信以获取命令并返回状态。 PsExec 不可再分发且来源不可用,但 存在一个名为PaExec 的开放版本。你可以下载它并 看看...您应该使用 PaExec 在下启动您的应用程序 NT_AUTHORITY\SYSTEM 有权访问登录屏幕的 DC 和 捕捉图像。但正如我所说,这是一个孤立的 DC,所以要抓住 来自用户屏幕和系统屏幕的快照,您必须运行 2 您的应用的实例。

    此答案是针对 C++ 问题发布的,但原则对您来说也是相同的,您也需要对 C# 应用程序使用相同的方法。

    【讨论】:

    • 非常感谢,测试它并在我提到的屏幕上正常工作。但是还有一件事我没有设法解决,那就是一些应用程序仍然会在它们上面显示一个黑匣子。它们也在正常屏幕上,我尝试使用 SYSTEM 运行我的程序,但仍然无法获得正确的屏幕截图。为什么这些应用程序上有一个黑框,我如何获得真正的屏幕截图? (在原帖上添加截图)
    • @user3425606 好吧,黑匣子问题还在你身上发生。但不幸的是,目前我不确定为什么仍然会发生这种情况。我唯一可以建议的是尝试使用 Win32 API 方法捕获屏幕。只是看看它是否有所作为:c-sharpcorner.com/code/765/…
    • 不幸的是,我想我尝试了所有的截图方法,但没有一个是完美的。它们都可以工作,但对于某些应用程序,它们仍然显示为黑匣子。我读过一篇关于保护应用程序免受屏幕抓取的文章,并且我读过它们使用黑盒技术。所以我真的认为黑匣子是因为这些应用程序受到保护,但我仍在尝试获取正确的屏幕截图。我不认为这是代码中的问题。并且不确定现在是否可能......
    猜你喜欢
    • 1970-01-01
    • 2020-02-03
    • 2011-10-19
    • 2012-12-05
    • 1970-01-01
    • 2011-03-05
    • 2012-06-21
    • 2021-09-28
    相关资源
    最近更新 更多