Windows 有没有可能;把戏;PrintScreen,在捕获之前将我表单的内容与其他内容交换?

Windows 有没有可能;把戏;PrintScreen,在捕获之前将我表单的内容与其他内容交换?,windows,detect,printscreen,Windows,Detect,Printscreen,我有一点挑战 在我们产品的早期版本中,我们有一个错误消息窗口(最后手段,未处理的异常),显示异常消息、类型、堆栈跟踪+各种位和信息 这个窗口对打印屏幕很友好,因为如果用户只需进行打印屏幕捕获,并通过电子邮件向我们发送屏幕截图,我们几乎拥有了开始诊断问题所需的一切 然而,对于普通用户来说,表单被认为过于技术化和“可怕”,因此它被调低到一个更友好的表单,仍然显示错误消息,但没有显示堆栈跟踪和一些我仍然希望得到的更血腥的细节。此外,表单还增加了通过电子邮件向我们发送文本文件的功能,其中包含我们以前拥有

我有一点挑战

在我们产品的早期版本中,我们有一个错误消息窗口(最后手段,未处理的异常),显示异常消息、类型、堆栈跟踪+各种位和信息

这个窗口对打印屏幕很友好,因为如果用户只需进行打印屏幕捕获,并通过电子邮件向我们发送屏幕截图,我们几乎拥有了开始诊断问题所需的一切

然而,对于普通用户来说,表单被认为过于技术化和“可怕”,因此它被调低到一个更友好的表单,仍然显示错误消息,但没有显示堆栈跟踪和一些我仍然希望得到的更血腥的细节。此外,表单还增加了通过电子邮件向我们发送文本文件的功能,其中包含我们以前拥有的所有内容+许多其他技术细节,基本上包括我们需要的所有内容

然而,用户仍然使用PrintScreen来捕获表单的内容和返回给我们的电子邮件,这意味着我现在要处理的信息量还不够理想

所以我想知道。我是否可以预先渲染与表单大小相同的位图,并在其上添加所需的所有内容,检测到PrintScreen被点击,并在捕获前快速将表单内容与我的位图交换,然后再返回

在你说“只是教育用户”之前,是的,这是行不通的。他们不是我们的用户,他们是我们客户所在地的用户,所以我们真的不能告诉他们要明智地对待所有这些

或者,除此之外,我是否有办法检测PrintScreen,告诉Windows忽略它,并通过将上述预渲染的位图转储到剪贴板上以准备放入电子邮件来对此作出反应

如果重要的话,代码是.NET3.5中的C#3.0,但是指向要查看/查找的内容的指针就足够了

我们的错误报告窗口具有以下功能:

  • 显示发生错误时拍摄的屏幕截图(包含显示错误对话框之前程序当时打开的所有窗口)
  • 显示一个文本文件,其中包含我们能想到的所有血淋淋的细节(但没有敏感内容)
  • 将上述两个文件保存到磁盘,以便用户将其附加到电子邮件或其他内容
  • 通过电子邮件向我们发送上述两个文件,可以打开新的支持案例,也可以输入现有的支持案例编号以添加更多信息
  • 忽略问题并希望它消失(返回应用程序)
  • 退出应用程序(最后手段)

我们仍然收到一些用户的截图。不是所有的,请注意,我的问题基本上是如何让PrintScreen按钮为那些仍在使用它的用户提供更多帮助。

为他们提供一个“PrintScreen”按钮来执行这些操作以及执行打印屏幕怎么样?如果您被锁定在这种让客户发送错误详细信息的方法中,那么这可能是一种更简单的方法

以下摘自我的评论,以便于参考(可能看起来很有帮助):


当错误弹出窗口激活时,是否可以完全禁用打印屏幕按钮?在屏幕上显示“请使用屏幕上清晰可见的按钮来报告错误”的消息:“我同意它破坏了预期的功能,但是如果你的用户真的那么愚蠢,你能做什么?”
或者,让它自动报告错误(或者将数据存储在本地,以便稍后获取,如果您没有询问原因就无法发送),而不询问用户。如果您希望能够将打印屏幕截图与详细的错误数据连接起来,请让它发送一个唯一的ID,其中的数据也显示在弹出窗口的一角。

一个选项:使用small,低对比度类型——例如深灰色对浅灰色——这样用户甚至看不到它,但打印屏幕会捕捉到它


但是如果你想检测打印屏幕并做你自己的事情,看起来就像是你想要的一个例子。

这在理论上是…我认为最好的解决方法

  • 截取WM_打印消息或将其插入进程。。。参见本文
  • 安装系统范围的键盘挂钩,截取打印屏幕键,并在捕获之前将其与内容交换。现在,我可以为你们指出几个地方,在这里,最后,在CodeProject上
现在,一旦您截获打印屏幕,通过捕获您想要捕获的内容来调用WM_print消息


我知道这很简短,但我希望这能让您继续。

我提出的唯一解决方案是提供大、大、易于阅读的工具栏按钮,让用户有机会保存错误对话框的内容:

  • 保存
  • 复制到剪贴板
  • 使用电子邮件发送
  • 打印
在所有这些之后,我使用Windows函数向用户显示一个黑色框,其中应显示表单:

此功能和用于支持Windows 7新增的窗口内容保护功能。此功能使应用程序能够通过一组特定的公共操作系统功能和API保护自己的屏幕窗口内容不被捕获或复制。但是,它仅在桌面窗口管理器(DWM)构成桌面时工作

需要注意的是,与安全功能或数字版权管理(DRM)的实现不同,不能保证使用SetWindowDisplayAffinity和以及其他必要的功能(如)将严格保护窗口内容,例如
//Code released into public domain. No attribution required.
if (!IsShiftKeyPressed())
   SetWindowDisplayAffinity(this.Handle, WDA_MONITOR); //Please don't screenshot the form, please e-mail me the contents!