ハマっている「お菓子」を教えて!

VB.netで開発しています
実行中の画面で自分のハードコピーを印刷ボタン押下で実行するPGを作りました。
開発環境でも,インストール先でもこの半年ぐらい問題なく動いていましたが,先ごろ新規ユーザーからエラーになるとクレームがでて困っています。原因と対策を教えてください

<<<エラー内容>>>
Just-In-Time (JIT) デバッグを呼び出すための詳細については、
ダイアログ ボックスではなく、このメッセージの最後を参照してください。

************** 例外テキスト **************
System.Runtime.InteropServices.ExternalException: 要求されたクリップボード操作に成功しませんでした。
場所 System.Windows.Forms.Clipboard.ThrowIfFailed(Int32 hr)
場所 System.Windows.Forms.Clipboard.GetDataObject(Int32 retryTimes, Int32 retryDelay)
場所 System.Windows.Forms.Clipboard.GetDataObject()
場所 クラス.BtnPrintDisp_Click(Object sender, EventArgs e)
場所 System.Windows.Forms.Control.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.OnClick(EventArgs e)
場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
場所 System.Windows.Forms.Control.WndProc(Message& m)
場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
場所 System.Windows.Forms.Button.WndProc(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** 読み込まれたアセンブリ **************

<<<関連ソース部分>>>
#Region "印刷ボタン"
Private Sub BtnPrintDisp_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPrintDisp.Click
'印刷しますか?のMsgBox
If MessageBox.Show(Com.GetIniString(ComIniNm, "QUESTIONMSG31", "MESSAGE"), Me.Text, _
MessageBoxButtons.OKCancel, MessageBoxIcon.Question) = Windows.Forms.DialogResult.OK Then
' [Alt]キー+[Print Screen]キーの送信
SendKeys.SendWait("%{PRTSC}")

' クリップボードに格納された画像の取得
Dim data As IDataObject = Clipboard.GetDataObject()
If data.GetDataPresent(DataFormats.Bitmap) = True Then
Dim bmp As Bitmap = CType(data.GetData(DataFormats.Bitmap), Bitmap)
' 取得した画像の印刷
gBmp = bmp
PrintDoc = New System.Drawing.Printing.PrintDocument
PrintDoc.Print()
End If
End If

End Sub
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDoc.PrintPage
' 印刷ページの描画を行う
gBmp.RotateFlip(RotateFlipType.Rotate270FlipNone)
e.Graphics.DrawImage(gBmp, New System.Drawing.Rectangle(50, 100, 480 * 1.5, 640 * 1.5))
End Sub
#End Region
よろしくお願いします

A 回答 (2件)

VB.NETと書かれていることから、.NET FrameWorkは1.0もしくは1.1でしょうか?



1.0ではSendeyでのPrintscreenは予約と書かれていたと思いますし、
実際には動くこともありましたが、Sendkeyでの画面印刷は不安定な
ため、別の方法で実施したことがあります。

以下のサイトのAPIを使用する方法に近い・・
http://dobon.net/vb/dotnet/graphics/screencaptur …

上記のエラーとコードを見た限り、Sendkeyの直後にクリップボードを
見に行っていますが、間に合っていない可能性はないでしょうか?

#ちょっと待ってみるとか・・

あと、こちらも参考にしてみてください。
http://dobon.net/vb/dotnet/vb6/sendkeys.html

#Vistaかどうかは判りませんが・・

この回答への補足

ありがとうございます
FrameWorkは2.0 OSは XP です
「Sendkeyでの画面印刷は不安定」ということですが、どういうときにエラーになるのか教えて頂けると助かるんですが・・
「#ちょっと待ってみるとか・・」の意見を取り入れて 0.1秒Sleepさせて、さらにDoEventも入れてみて試して見ます
不具合再現実機(これでは必ずエラーになります→PCの設定が違うんではないかと疑ってこの質問をしたのですが・・)が手元にないため、すぐには結果が出ないです。
それでだめなら、指摘HPに乗っている 別のAPIを試して見ます

補足日時:2008/12/24 18:35
    • good
    • 0

>「Sendkeyでの画面印刷は不安定」ということですが、どういうときにエラーになるのか教えて頂けると助かるんですが・・



画面印刷だけではないですが、SendkeyはアクティブなWindowに対して
実行されるので、画面遷移やPopUp、ユーザの操作などいろんな原因で
ミスすることがあります。
#まともな業務システムには使用しないのが懸命かと・・(Vb以外でも)

私がPrintScreenを.NETで実装する際、最初はSendKeyを使ってテスト
してみました。
#FrameWork1.0では正常に動かなかったですが・・

その他、Printscreen後にClipBoadを読む際に失敗すること
何度も経験しました。
#エラー処理とリトライで逃げましたが

また、他のアプリを同時に動かす場合は、PrintScreenのデータと
他の画像のCopyなども区別する必要があります。
(BITMAPの判定だけではNGの場合もあり)
    • good
    • 0
この回答へのお礼

ありがとうございました
Sendwait後にsleep1秒入れたり、DoEvents入れたりしましたが、結果が同じだった(必ず同じエラーになる)
結局、指摘HPの別APIですることになりました
まだ、客先で試行できないので結果が特定できないですが、この質問は〆ます。

お礼日時:2008/12/29 09:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報