Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 自动化';PrtScn';击键的行为类似于';Alt+;PrtScrn&x27;_C#_Automation_Screenshot_Sendkeys - Fatal编程技术网

C# 自动化';PrtScn';击键的行为类似于';Alt+;PrtScrn&x27;

C# 自动化';PrtScn';击键的行为类似于';Alt+;PrtScrn&x27;,c#,automation,screenshot,sendkeys,C#,Automation,Screenshot,Sendkeys,我们需要一个用于单元测试的应用程序截图CaptureScreen()和CopyFromScreen()以某种方式忽略应用程序并返回空桌面的图片。所以我们写这篇文章是为了伪造一个PrtScn击键: public static Bitmap GetAltScreenshot() { Clipboard.Clear(); SendKeys.SendWait("{PRTSC}"); while (!Clipboard.ContainsImage()) {

我们需要一个用于单元测试的应用程序截图
CaptureScreen()
CopyFromScreen()
以某种方式忽略应用程序并返回空桌面的图片。所以我们写这篇文章是为了伪造一个
PrtScn
击键:

public static Bitmap GetAltScreenshot()
{
    Clipboard.Clear();
    SendKeys.SendWait("{PRTSC}");
    while (!Clipboard.ContainsImage())
    {
        Thread.Sleep(500);
    }
    return new Bitmap(Clipboard.GetImage());
}
Alt
不是击键的一部分,因此应返回整个屏幕的位图。然而,不知何故,这段代码只返回了聚焦窗口。这很好,解决了我们的问题-但我们不知道如何解决

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

事实上有一个“原因”,请转到您可以使用的关键缩写的文档。注意打印屏幕的条目:

{PRTSC}(保留供将来使用)

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


请记下关于可以添加到.config文件的
条目的注释,在同一MSDN页面的下一页。我怀疑,但事实上不知道SendInput方法更可靠。

你应该看看:@GeorgeJohnston相信我,我们以前试过使用
g.CopyFromScreen
以及我们能找到的所有其他捕获方法。它们在我的机器上都表现良好,但在公司内的其他机器上却给出了奇怪的结果。可能是SendKeys类只是将“{PRTSC}”键字符串解释为Alt+PrtScn键组合吗?另外,您可以手动将焦点设置为整个尖叫声?首先,在发送{PRTSC}之前,您是否尝试过执行一次
SendKeys.Flush()
,这是一次很长的尝试,但为了确保队列中没有其他消息,这至少值得排除。@Brian
SendKeys.Flush()
没有效果。是的,我知道这个“原因”(事实上,我想你的一篇老帖子给我指出了这个原因),但我或多或少好奇地想知道这个谜团的内部运作。我想这是微软愿意让我们知道的。我真的不知道背后的原因。他们在没有appsetting的情况下使用的日志钩子,呃,很奇怪。