tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: フォームの画像を1秒おきに、JPEG形式に保存する方法
投稿日: 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

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。