5

我有点挑战。

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

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

然而,对于普通用户来说,该表单被认为过于技术性和“吓人”,因此它被调低为更友好的表单,仍然显示错误消息,但不显示堆栈跟踪和一些我仍然想要的更血腥的细节喜欢得到。此外,表单还添加了向我们发送电子邮件的功能,该文本文件包含我们之前拥有的所有内容以及许多其他技术细节,基本上是我们需要的一切。

但是,用户仍然使用 PrintScreen 来捕获表单的内容并将其通过电子邮件发送给我们,这意味着我现在可以处理的信息量并不理想。

所以我想知道。我是否可以预先渲染一个与我的表单大小相同的位图,上面包含我需要的所有内容,检测到 PrintScreen 被击中并在捕获之前用我的位图快速交换表单内容,然后再返回?

在你说“只是教育用户”之前,是的,那是行不通的。这些不是外面的用户,他们是我们客户处的用户,所以我们真的不能告诉他们要聪明得多。

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

代码是 .NET 3.5 中的 C# 3.0,如果它很重要的话,但是指向某些东西的指针就足够了。

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

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

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

4

5 回答 5

2

一种选择:使用小的、低对比度的类型将堆栈跟踪和其他可怕的东西放入错误屏幕——例如浅灰色上的深灰色——这样用户甚至看不到它,但打印屏幕会捕获它.

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

于 2010-05-15T20:12:44.343 回答
1

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

从我下面的评论中提取以便于参考(看起来很有帮助,也许):

codeproject.com/KB/cs/PrintScreen.aspx

于 2010-05-15T20:03:59.273 回答
1

当错误弹出窗口处于活动状态时,是否可以完全禁用“打印屏幕”按钮?让它显示一条类似于“请使用屏幕中间清晰可见的按钮报告错误”的消息我同意它破坏了预期的功能,但如果你的用户真的那么愚蠢,你能做什么......

或者,让它自动报告错误(或将数据存储在本地,以便稍后获取,如果您因某种原因无法发送),而无需询问用户。如果您希望能够将打印筛选的屏幕截图与详细的错误数据联系起来,请让它发送一个唯一的 ID,该 ID 也显示在弹出窗口的一角。

于 2010-05-15T20:11:38.923 回答
1

这是理论上的……我认为最好的处理方法

现在,一旦您截获了打印屏幕,通过捕获您想要捕获的内容来调用 WM_PRINT 消息。

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

于 2010-05-15T20:25:09.380 回答
0

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

  • 节省
  • 复制到剪贴板
  • 使用电子邮件发送
  • 打印

毕竟,我使用 Windows 函数SetWindowDisplayAffinity向用户显示表单应该位于的黑框:

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

需要注意的是,与安全功能或数字版权管理 (DRM) 的实现不同,不能保证使用SetWindowDisplayAffinityGetWindowDisplayAffinity以及其他必要的功能(例如DwmIsCompositionEnabled)将严格保护窗口内容,例如有人在屏幕照片。

如果他们的屏幕截图显示一个大黑框,希望他们能得到提示。

我确实添加了一个失败,如果他们在单击“显示错误详细信息”时按住 shift ,我不会在表单构建期间添加保护:

//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!
于 2015-12-18T14:53:39.960 回答