スナップショットを取得(U)          <TOP>


SendInput キーストローク、マウスの動き、ボタンのクリックなどを合成
OpenClipboard クリップボードをオープン
IsClipboardFormatAvailable 指定したフォーマットがクリップボードにあるかどうか判定
GetClipboardData クリップボードから指定フォーマットのデータを検索
CloseClipboard クリップボードをクローズ
CreateCompatibleDC メモリデバイスコンテキストを作成
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
GetObject オブジェクト取得
BitBlt ビットブロック転送
DeleteDC 指定されたデバイスコンテキストを削除
GetDC デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
 

「PrintScreen」キーの操作に相当するイベントを擬似的に発生させ、クリップボードに画面全体のスナップショットを取得。

「表示」で、PictureBoxに表示させています。

 

'================================================================
'= スナップショットを取得(U)
'=    (SendInput.bas)
'================================================================
#include "Windows.bi"

Type KEYBDINPUT
    wVk                 As Integer
    wScan               As Integer
    dwFlags             As Long
    ntime               As Long
    dwExtraInfo         As Long
    bytUnusedPadding(7) As Byte
End Type

Type tagINPUT
    dwtype As Long
    ki     As KEYBDINPUT
End Type

Type BITMAP
    bmType       As Long
    bmWidth      As Long
    bmHeight     As Long
    bmWidthBytes As Long
    bmPlanes     As Integer
    bmBitsPixel  As Integer
    bmBits       As Long
End Type

#define INPUT_KEYBOARD 1
#define INPUT_HARDWARE 2
#define VK_SNAPSHOT &H2C                '[Snap Shot]
#define KEYEVENTF_KEYUP &H2             'キーを放す
#define CF_BITMAP 2                     'ビットマップのデータ(HBITMAP)
#define SRCCOPY &HCC0020                'そのまま転送

' キーストローク、マウスの動き、ボタンのクリックなどを合成
Declare Function Api_SendInput& Lib "user32" Alias "SendInput" (ByVal cInputs&, ByRef pInputs As tagINPUT, ByVal cbSize&)

' クリップボードをオープン
Declare Function Api_OpenClipboard& Lib "user32" Alias "OpenClipboard" (ByVal hWnd&)

' 指定したフォーマットがクリップボードにあるかどうか判定
Declare Function Api_IsClipboardFormatAvailable& Lib "user32" Alias "IsClipboardFormatAvailable" (ByVal wFormat&)

' クリップボードから指定フォーマットのデータを検索
Declare Function Api_GetClipboardData& Lib "user32" Alias "GetClipboardData" (ByVal wFormat&)

' クリップボードをクローズ
Declare Function Api_CloseClipboard& Lib "user32" Alias "CloseClipboard" ()

' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&)

' 指定されたデバイスコンテキストのオブジェクトを選択
Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&)

' オブジェクト取得
Declare Function Api_GetObject& Lib "gdi32" Alias "GetObjectA" (ByVal hObject&, ByVal nCount&, lpObject As Any)

' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー
Declare Function Api_BitBlt& Lib "gdi32" Alias "BitBlt" (ByVal hDestDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal dwRop&)

' 指定されたデバイスコンテキストを削除
Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

Var Shared Text1 As Object
Var Shared Picture1 As Object
Var Shared Button1 As Object
Var Shared Button2 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Picture1.Attach GetDlgItem("Picture1") : Picture1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Button2.Attach GetDlgItem("Button2") : Button2.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var ta(1) As tagINPUT
    Var Ret As Long

    'インプットイベントの種類を指定
    ta(0).dwtype = INPUT_KEYBOARD

    '仮想キーコードを指定
    ta(0).ki.wVk = VK_SNAPSHOT

    'インプットイベントの種類を指定
    ta(1).dwtype = INPUT_KEYBOARD

    '仮想キーコードを指定
    ta(1).ki.wVk = VK_SNAPSHOT

    '動作を指定
    ta(1).ki.dwFlags = KEYEVENTF_KEYUP

    'キーストロークを合成
    Ret = Api_SendInput(2, ta(0), Len(ta(0)))
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var bmp As BITMAP
    Var hBit As Long
    Var phDC As Long
    Var mhDC As Long
    Var Ret As Long

    phDC = Api_GetDC(Picture1.GethWnd)

    Picture1.Cls

    'Bitmap型式データの有無を調査
    If Api_IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
        Ret = Api_OpenClipboard(GethWnd)

        '指定フォーマットのBITMAPデータを検索
        hBit = Api_GetClipboardData(CF_BITMAP)

        'メモリデバイスコンテキストを作成
        mhDC = Api_CreateCompatibleDC(phDC)

        'Object取得
        Ret = Api_GetObject(hBit, Len(bmp), bmp)

        'Object選択
        Ret = Api_SelectObject(mhDC, hBit)

        '指定の(PictureBox)のデバイスコンテキストにメモリデバイスコンテキストのデータを転送
        Ret = Api_BitBlt(phDC, 0, 0, bmp.bmWidth, bmp.bmHeight, mhDC, 0, 0, SRCCOPY)

        Ret = Api_ReleaseDC(Picture1.GethWnd, phDC)
        Ret = Api_DeleteDC(mhDC)
        Ret = Api_CloseClipboard()
    End If
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End