デスクトップイメージを転送 <TOP>
デスクトップイメージを転送します。
CreateCompatibleDC
指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
CreateDIBSection プリケーションから直接書き込むことのできるDIBを作成
GetDIBits 指定されたビットマップのビットを取得し、指定された形式でバッファへコピー
SetDIBitsToDevice
DIBの色データを使って、指定された長方形内のピクセルを、転送先のデバイスコンテキストに関連付けられているデバイスの指定された長方形内に描画
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
DeleteDC
指定されたデバイスコンテキストを削除
DeleteObject オブジェクトに関連付けられていたすべてのシステムリソースを解放
BitBlt
ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー
GetDC
指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
'================================================================ '= デスクトップイメージを転送 '= (SetDIBitsToDevice.bas) '================================================================ #include "Windows.bi" #define BI_RGB 0 '非圧縮 #define DIB_RGB_COLORS 0 'RGBカラーテーブル #define SRCCOPY &HCC0020 'そのまま転送 Type BITMAPINFOHEADER '40バイト biSize As Long 'イメージ バッファのバイト数 biWidth As Long '幅 biHeight As Long '高さ biPlanes As Integer '常に1 biBitCount As Integer '1ピクセルあたりのカラービット数 biCompression As Long '圧縮方法 biSizeImage As Long 'ピクセルデータの全バイト数 biXPelsPerMeter As Long '0または水平解像度 biYPelsPerMeter As Long '0または垂直解像度 biClrUsed As Long 'ビットマップを表示するための色数(0) biClrImportant As Long 'ビットマップを表示するための重要な色数(0) End Type Type RGBQUAD rgbBlue As Byte '青の輝度 rgbGreen As Byte '緑の輝度 rgbRed As Byte '赤の輝度 rgbReserved As Byte '予約(常に0) End Type Type BITMAPINFO bmiHeader As BITMAPINFOHEADER bmiColors As RGBQUAD '256色の場合、bmiColors(255) As RGBQUADとする End Type ' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成 Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&) ' アプリケーションから直接書き込むことのできるDIBを作成 Declare Function Api_CreateDIBSection& Lib "gdi32" Alias "CreateDIBSection" (ByVal hDC&, pBitmapInfo As BITMAPINFO, ByVal un&, ByVal lplpVoid&, ByVal handle&, ByVal dw&) ' DIBのピクセルデータを取得 Declare Function Api_GetDIBits& Lib "gdi32" Alias "GetDIBits" (ByVal aHDC&, ByVal hBitmap&, ByVal nStartScan&, ByVal nNumScans&, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage&) ' DIBをデバイスコンテキスト上の矩形領域に描画 Declare Function Api_SetDIBitsToDevice& Lib "gdi32" Alias "SetDIBitsToDevice" (ByVal hDC&, ByVal x&, ByVal y&, ByVal dx&, ByVal dy&, ByVal SrcX&, ByVal SrcY&, ByVal Scan&, ByVal NumScans&, Bits As Any, BitsInfo As BITMAPINFO, ByVal wUsage&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' 指定されたデバイスコンテキストを削除 Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&) ' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&) ' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー 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_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) Var Shared Button1 As Object Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 Var Shared iBitmap As Long Var Shared iDC As Long ShowWindow -1 Cls '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var hDC As Long Var bi As BITMAPINFO Var Cnt As Long Var Ret As Long hDC = Api_GetDC(GethWnd) bi.bmiHeader.biSize = Len(bi.bmiHeader) bi.bmiHeader.biWidth = 300 bi.bmiHeader.biHeight = 250 bi.bmiHeader.biPlanes = 1 bi.bmiHeader.biBitCount = 24 bi.bmiHeader.biCompression = BI_RGB '幅 * 高さ * 3(RGB) Var bBytes(bi.bmiHeader.biWidth * bi.bmiHeader.biHeight * 3) As Byte '「0」の場合、ディスプレイのデバイスコンテキスト iDC = Api_CreateCompatibleDC(0) iBitmap = Api_CreateDIBSection(iDC, bi, DIB_RGB_COLORS, ByVal 0, ByVal 0, ByVal 0) Ret = Api_SelectObject(iDC, iBitmap) Ret = Api_BitBlt(iDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, Api_GetDC(0), 0, 0, SRCCOPY) Ret = Api_GetDIBits(iDC, iBitmap, 0, bi.bmiHeader.biHeight, bBytes(1), bi, DIB_RGB_COLORS) For Cnt = 1 To (bi.bmiHeader.biWidth * bi.bmiHeader.biHeight * 3) If bBytes(Cnt) < 50 Then bBytes(Cnt) = 0 Else bBytes(Cnt) = bBytes(Cnt) - 50 End If Next Cnt Ret = Api_SetDIBitsToDevice(hDC, 0, 0, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, 0, 0, 0, bi.bmiHeader.biHeight, bBytes(1), bi, DIB_RGB_COLORS) Ret = Api_DeleteDC(iDC) Ret = Api_DeleteObject(iBitmap) Ret = Api_ReleaseDC(GethWnd, hDC) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End