タイトル | : Re: フォームの画像を1秒おきに、JPEG形式に保存する方法 |
記事No | : 2448 |
投稿日 | : 2005/10/23(Sun) 15:08 |
投稿者 | : YAS |
[OSのVer]:Windows [VBのVer]:VB.NET 開発初心者さん,卒業研究ご苦労様です。
(注:私も初心者みたいなものなので,用語や言葉遣いが正確でありません。)
NullReferenceExceptionはオブジェクトの実体がなく,参照がNothingのままの ときに発生するのだと思います。
>iData = Clipboard.GetDataObject() ここでクリップボードからデータを取れていなくてiDataがNothingのまま だからではないでしょうか?
>img = CType(iData.GetData(DataFormats.Bitmap), Image) iDataの実体がないのにiDataオブジェクトを使おうとしているのでエラーに なるのだと思います。
原因は,タイマーから呼び出されるintervalPictureがタイマーを作成したスレッド とは別のシステムが提供したスレッドで動作しているためだと思います。 この別スレッドからはクリップボードにアクセスできないのだと思います。 そこでデリゲートを使い,次のようなコードにすればメインスレッドに戻ってクリップ ボードにアクセスできると思います。お試しください。
Private Sub intervalPicture(ByVal state As Object) Dim i As Integer Dim img As Image For i = 0 To 9 ' [Alt]キーを押す keybd_event(vbKeyMenu, 0, KEYEVENTF_EXTENDEDKEY, 0) ' [PrintScreen]キーを押す keybd_event(vbKeySnapshot, 0, KEYEVENTF_EXTENDEDKEY, 0) ' [PrintScreen]キーを離す keybd_event(vbKeySnapshot, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) ' [Alt]キーを離す keybd_event(vbKeyMenu, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0) ' タイミングの調整 Application.DoEvents() ' クリップボードからフォームの画像を取得 Dim dlg As New GetClipBoardDelegate(AddressOf GetClipBoard) img = Me.Invoke(dlg) 'ビットマップデータ形式に関連付けられているデータを取得 If Not (img Is Nothing) Then img.Save("CaptureImage" + i.ToString + ".JPEG", _ System.Drawing.Imaging.ImageFormat.Jpeg) End If Next End End Sub
Delegate Function GetClipBoardDelegate() As Image
Private Function GetClipBoard() As Image ' クリップボードからフォームの画像を取得 Dim iData As IDataObject = Clipboard.GetDataObject() Dim img As Image = CType(iData.GetData(DataFormats.Bitmap), Image) 'クリップボードから削除 Clipboard.SetDataObject(New DataObject()) Return img End Function
|