【问题标题】:Automated 'PrtScn' keystroke acts like 'Alt+PrtScrn'自动“PrtScn”击键行为类似于“Alt+PrtScrn”
【发布时间】:2017-06-21 21:27:28
【问题描述】:

我们需要一个应用的屏幕截图来进行单元测试。 CaptureScreen()CopyFromScreen() 以某种方式忽略该应用程序并返回空桌面的图片。所以我们写这个来伪造PrtScn 击键:

public static Bitmap GetAltScreenshot()
{
    Clipboard.Clear();
    SendKeys.SendWait("{PRTSC}");
    while (!Clipboard.ContainsImage())
    {
        Thread.Sleep(500);
    }
    return new Bitmap(Clipboard.GetImage());
}

Alt 不是击键的一部分,因此它应该返回一个整个屏幕的位图。然而不知何故,这个 sn-p 只返回焦点窗口。这很好,这解决了我们的问题 - 但我们不明白如何。

为什么只返回聚焦窗口的快照,而不是整个监视器?

【问题讨论】:

  • @GeorgeJohnston 相信我,我们之前尝试过使用g.CopyFromScreen,以及我们能找到的所有其他捕获方法。它们在我的机器上都表现良好,但在公司内的其他机器上却给出了奇怪的结果。
  • 可能是 SendKeys 类只是将“{PRTSC}”键字符串解释为 Alt + PrtScn 组合键吗?另外,您也许可以手动将焦点设置为整个屏幕? link 在第一个注释中。
  • 您是否尝试过在发送 {PRTSC} 之前执行SendKeys.Flush(),这有点远,但只是为了确保您在队列中没有其他消息,这至少值得排除。
  • @Brian SendKeys.Flush() 无效。无论有没有它,代码都能完美运行。

标签: c# automation screenshot sendkeys


【解决方案1】:

实际上有一个“原因”,请转到MSDN Library article,它记录了您可以使用的关键缩写。注意 PRINT SCREEN 条目:

{PRTSC}(留作将来使用)

这是一种有点笨拙的说法:“我们知道它不起作用,也许有一天会解决这个问题”。那一天还没有到来。因此,您可能正在测试此键的故障模式,并且实际上喜欢它的工作方式。这当然是不健康的,他们实际上可能有一天会解决问题并破坏您的程序。

请注意有关您可以添加到 .config 文件中的 <appSettings> 条目的注释,位于同一 MSDN 页面的下方。我怀疑,但实际上不知道,SendInput 方法更可靠。

【讨论】:

  • 是的,我知道那个“原因”(事实上,我认为你的一篇旧帖子指出了我)但我或多或少好奇地想知道这个谜团的内部运作。我想这与微软愿意让我们知道的一样多。
  • 我真的不知道根本原因。他们在没有 appsetting 的情况下使用的日志挂钩是,呃,古怪。
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 2015-12-06
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 2013-04-04
相关资源
最近更新 更多