スナップショットを取る
                                                         玄関へお回り下さい。
スクリーンのスナップショットをクリップボードに保存及び印刷         (273)
フォームにCommandボタンを2個貼り付けておいて下さい。
  Option Explicit   'SampleNo=273 WindowsXP VB6.0(SP5) 2003.03.30
'キーストロークをシミュレートする(P1065)
Private Declare Sub keybd_event Lib "user32.dll" _
    (ByVal bVk As Byte, ByVal bScan As Byte, _
     ByVal dwFlags As Long, ByVal dwExtraInfo As Long)

Private Const VK_SNAPSHOT = &H2C      'PrintScreen キー(P1051)
Private Const VK_LMENU = &HA4        'Altキー
Private Const KEYEVENTF_KEYUP = &H2     'キーはアップ状態
Private Const KEYEVENTF_EXTENDEDKEY = &H1  'スキャンコードは拡張コード


Private Sub SaveWindowPic(Optional ActWind As Boolean = True, _
                  Optional
PrintOn As Boolean = False)

  Dim MyFileName As String, PicData As Picture, OsVer As Single
  Clipboard.Clear
  OsVer = CreateObject("SysInfo.SYSINFO").OSVersion

  If ActWind Then
  'アクティブ ウィンドウのスナップショットを取得する
  '以下の2方法どれでもOK(Win98SE/WinXP/Win95)
  'どの方法でも上記確認機種は同じ動作しますのでMSのサンプルの方法を使用
    Call keybd_event(VK_LMENU, &H56, _
                KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(VK_SNAPSHOT, &H79, _
                KEYEVENTF_EXTENDEDKEY Or 0, 0)
    Call keybd_event(VK_SNAPSHOT, &H79, _
                KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    Call keybd_event(VK_LMENU, &H56, _
                KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
'    ==================== こちらでも同じようです ==================
'    Call keybd_event(VK_LMENU, 0, _
                KEYEVENTF_EXTENDEDKEY Or 0, 0)
'    Call keybd_event(VK_SNAPSHOT, 0, _
                KEYEVENTF_EXTENDEDKEY Or 0, 0)
'    Call keybd_event(VK_SNAPSHOT, 0, _
           KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
'    Call keybd_event(VK_LMENU, 0, _
           KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
  ElseIf ActWind = False And OsVer < 5 Then
  '画面全体のスナップショットを取得する(Win98SE/Win95)
    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY, 0)
    Call keybd_event(VK_SNAPSHOT, 1, KEYEVENTF_EXTENDEDKEY Or _
                                     KEYEVENTF_KEYUP, 0)
  Else
  '画面全体のスナップショットを取得する(WinXP)
    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0)
    Call keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or _
                                     KEYEVENTF_KEYUP, 0)
  End If

  DoEvents
  'クリップボード内にビットマップ形式のデータがあるか調べる
  If Clipboard.GetFormat(vbCFBitmap) Then
    'ファイル名を自動生成
    MyFileName = App.Path & "\" & Format$(Now, "yymmddhhmmss") & ".BMP"
    '表示データをビットマップ形式のデータで保存
    Set PicData = Clipboard.GetData
    Call SavePicture(PicData, MyFileName)
    If PrintOn Then
      '印刷する場合
      With Printer
        .ScaleMode = vbMillimeters
        .PaperSize = vbPRPSA4
        .Orientation = vbPRORLandscape
        .PaintPicture PicData, 10, 0
        .EndDoc
      End With
    End If
  Else
    MsgBox "保存出来ませんでした。"
  End If
End Sub

Private Sub Command1_Click()
'アクティブウィンドウのみをクリップボードにコピー
  Call SaveWindowPic(True, False)   '印刷する場合は True に設定
End Sub

Private Sub Command2_Click()
'スクリーン全体をクリップボードにコピー
  Call SaveWindowPic(False, False)
End Sub
 
掲示板で質問がありサンプルを作ったのですが、OSによってSNAPSHOTキーによる動作が違う
事を知り色々調べた(調べてもらった)結果をまとめておきます。
Win9x 系  WinNT系  WinXP/2000 系 の3種類に分類されるようです。
Win9x 系 WinNT Altキーを併用する事で共通の動作となるようです(未確認)
従ってOSのバージョン5以上と以下とで処理を分けております。
アクティブウィンドウの場合はAltキーを併用すれば全OS共(Win系)同じ動作をするようです。

Web で紹介されている中の多くはWin9x 系を主体に書かれているようです。Win9x系に限れば、
結構色んな書き方をしても動くようでサンプルもさまざまです。
中には Call keybd_event(VK_SNAPSHOT, 0, 0, 0) このような1行のみのコードもあります、簡単で
動作するからといって安易に使わない事をお薦めします。

記入している機種については動作確認済みですが、その他の機種については確認してからご使用下さい。
今回、ピクチャーボックスを介さずに画像を保存できたり、印刷できる事も解ったのでピクチャーボックスを使用しておりません。
上記サンプルを作成するにあたり Starfish さんにかなりお世話になりました。

参考リンク  http://support.microsoft.com/default.aspx?scid=kb;ja;411704
関係掲示板の記事
         - 実行画面をファイルに保存 - HB 2003/03/30-15:55 No.3317  の一連


2006/02/27


VBレスキュー(花ちゃん)
Visual Basic6.0  VB6.0