5

少し挑戦があります。

以前のバージョンの製品では、エラーメッセージウィンドウ(最後の手段、未処理の例外)があり、例外メッセージ、タイプ、スタックトレース、およびさまざまな情報が表示されていました。

このウィンドウは、ユーザーが単にprintscreenキャプチャを実行し、スクリーンショットを電子メールで送信した場合、問題の診断を開始するために必要なほぼすべてのものが揃っているという点で、printscreenに適していました。

ただし、このフォームは通常のユーザーには技術的すぎて「怖い」と見なされたため、よりわかりやすい形式にトーンダウンされ、エラーメッセージは表示されましたが、スタックトレースや、私がまだ残していたより厄介な詳細は表示されませんでした。取得するのが好きです。さらに、フォームには、以前に持っていたすべてのものと、基本的に必要なすべてのものを含む他の多くの技術的な詳細を含むテキストファイルを電子メールで送信する機能が追加されました。

ただし、ユーザーは引き続きPrintScreenを使用してフォームのコンテンツをキャプチャし、メールで返信します。これは、情報量が最適ではないことを意味します。

だから私は疑問に思いました。フォームと同じサイズのビットマップを必要なものすべてで事前にレンダリングし、PrintScreenがヒットしたことを検出し、キャプチャする前にフォームの内容をビットマップとすばやく交換してから、後で元に戻すことはできますか?

そして、あなたが「ただユーザーを教育する」と言う前に、はい、それはうまくいきません。これらはアウトユーザーではなく、お客様の場所のユーザーであるため、それほど賢明にするように指示することはできません。

または、これを除いて、PrintScreenを検出し、Windowsに無視するように指示し、代わりに、前述の事前にレンダリングされたビットマップをクリップボードにダンプして、電子メールに配置できるようにする方法はありますか?

コードは、重要な場合は.NET 3.5のC#3.0ですが、何かを調べたり探したりするためのポインターで十分です。

エラー報告ウィンドウには、次の機能があります。

  • エラーが発生したときに撮影されたスクリーンショットを表示します(エラーダイアログが表示される前の、その時点で開いていたプログラムのすべてのウィンドウが含まれています)
  • 考えられるすべての厄介な詳細を含むテキストファイルを表示します(ただし、機密性の高いものは含まれません)
  • 上記の2つのファイルをディスクに保存し、後でユーザーがメールなどに添付できるようにします。
  • 新しいサポートケースを開くか、既存のサポートケース番号を入力して情報を追加することにより、上記の2つのファイルをメールで送信します。
  • 問題を無視して、問題が解決することを願っています(アプリに戻る)
  • アプリケーションを終了します(最後の手段)

一部のユーザーからはまだスクリーンショットを取得しています。すべてではありませんが、私の質問は基本的に、PrintScreenボタンをまだ使用しているユーザーのためにもう少し役立つようにする方法です。

4

5 に答える 5

2

1つのオプション:スタックトレースやその他の恐ろしいものを、小さい低コントラストのタイプ(たとえば、ライトグレーにダークグレー)を使用してエラー画面に配置します。これにより、ユーザーは実際には表示されませんが、PrintScreenはそれをキャプチャします。 。

しかし、PrintScreenを検出して独自のことをしたい場合、これはあなたが望むものの例のように見えます。

于 2010-05-15T20:12:44.343 に答える
1

これらのアクションを実行するだけでなく、Print Screenを実行する「PrintScreen」ボタンを提供するのはどうですか?顧客にエラーの詳細を送信させるこの方法に縛られている場合は、これがより簡単な方法である可能性があります。

参照しやすいように、以下の私のコメントから削除しました(おそらく役立つようです):

codeproject.com/KB/cs/PrintScreen.aspx

于 2010-05-15T20:03:59.273 に答える
1

エラーポップアップがアクティブなときに、Print Screenボタンを完全に無効にすることはできませんか?「画面の中央にあるはっきりと見えるボタンを使用してエラーを報告してください」というメッセージを表示させます。期待される機能が損なわれることに同意しますが、ユーザーが本当に愚かである場合は、どうすればよいですか...

または、ユーザーに確認せずに、エラーを自動的に報告するようにします(または、データをローカルに保存して、後で取得できるようにします。何らかの理由で確認せずに送信できない場合)。印刷されたスクリーンショットを詳細なエラーデータと接続できるようにする場合は、ポップアップの隅にも表示されるデータと一意のIDを送信するようにします。

于 2010-05-15T20:11:38.923 に答える
1

これは理論的には...それに対処するための最良の方法だと思います

  • WM_PRINTメッセージをインターセプトするか、プロセスに挿入します...こちらの記事を参照してください
  • システム全体のキーボードフックを取り付け、Print Screenキーをインターセプトし、キャプチャする前にコンテンツと交換します。さて、ここでCodeProjectのいくつかの場所、そしてここでもキーボードスパイ、そして最後にCodeProjectのグローバルマウスとキーボードフックを紹介します。

ここで、印刷画面をインターセプトしたら、キャプチャするコンテンツをキャプチャして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 に答える