スナップショットを取る |
スクリーンのスナップショットをクリップボードに保存及び印刷 (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 の一連 |