Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос:    Как снимок экрана поместить в пе Добавлено: 01.04.05 22:53  

Автор вопроса:  PeterS
Всем доброго времени суток!

Подскажите, пожалуйста, как поместить снимок экрана, сделанный с помощью BitBlt (наверное многие изучали этот пример с помещением снимка на форму), в переменную?
Или может использовать другие функции. В общем нужен пример или дельный совет!

Спасибо за внимание!

Ответить

  Ответы Всего ответов: 19  

Номер ответа: 1
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 01.04.05 23:21
Прога для делания скриншотов на C++ моего и MSDN изготовления :)
#include <windows.h>
#include <stdio.h>


PBITMAPINFO CreateBitmapInfoStruct(HBITMAP hBmp){
    BITMAP bmp;
    PBITMAPINFO pbmi;
    WORD    cClrBits;

    // Retrieve the bitmap color format, width, and height.
    GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp);

    // Convert the color format to a count of bits.
    cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
    if (cClrBits == 1)
        cClrBits = 1;
    else if (cClrBits <= 4)
        cClrBits = 4;
    else if (cClrBits <= 8)
        cClrBits = 8;
    else if (cClrBits <= 16)
        cClrBits = 16;
    else if (cClrBits <= 24)
        cClrBits = 24;
    else cClrBits = 32;

    // Allocate memory for the BITMAPINFO structure. (This structure
    // contains a BITMAPINFOHEADER structure and an array of RGBQUAD
    // data structures.)

     if (cClrBits != 24) pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * (1<< cClrBits));

     // There is no RGBQUAD array for the 24-bit-per-pixel format.

     else pbmi = (PBITMAPINFO) LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER));

    // Initialize the fields in the BITMAPINFO structure.

    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = bmp.bmWidth;
    pbmi->bmiHeader.biHeight = bmp.bmHeight;
    pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
    pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
    if (cClrBits < 24) pbmi->bmiHeader.biClrUsed = (1<<cClrBits);

    // If the bitmap is not compressed, set the BI_RGB flag.
    pbmi->bmiHeader.biCompression = BI_RGB;

    // Compute the number of bytes in the array of color
    // indices and store the result in biSizeImage.
    // For Windows NT, the width must be DWORD aligned unless
    // the bitmap is RLE compressed. This example shows this.
    // For Windows 95/98/Me, the width must be WORD aligned unless the
    // bitmap is RLE compressed.
    pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8 * pbmi->bmiHeader.biHeight;
    // Set biClrImportant to 0, indicating that all of the
    // device colors are important.
     pbmi->bmiHeader.biClrImportant = 0;
     return pbmi;
 }

void CreateBMPFile(LPTSTR pszFile, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC){
     HANDLE hf;                 // file handle
    BITMAPFILEHEADER hdr;       // bitmap file-header
    PBITMAPINFOHEADER pbih;     // bitmap info-header
    LPBYTE lpBits;              // memory pointer
    ;DWORD dwTotal;              // total count of bytes
    ;DWORD cb;                   // incremental count of bytes
    BYTE *hp;                   // byte pointer
    ;DWORD dwTmp;

    pbih = (PBITMAPINFOHEADER) pbi;
    lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);

    // Retrieve the color table (RGBQUAD array) and the bits
    // (array of palette indices) from the DIB.
    GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi, DIB_RGB_COLORS);

// Create the .BMP file.
    hf = CreateFile(pszFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"
    // Compute the size of the entire file.
    hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage);
    hdr.bfReserved1 = 0;
    hdr.bfReserved2 = 0;

    // Compute the offset to the array of color indices.
    hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD);

    // Copy the BITMAPFILEHEADER into the .BMP file.
    WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp,  NULL);

    // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
    WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER) + pbih->biClrUsed * sizeof (RGBQUAD), (LPDWORD) &dwTmp, NULL);

    // Copy the array of color indices into the .BMP file.
    dwTotal = cb = pbih->biSizeImage;
    hp = lpBits;
    WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL);

    // Close the .BMP file.
    CloseHandle(hf);

    // Free memory.
    GlobalFree((HGLOBAL)lpBits);
}


void main(int argc, char *argv[];){
int sx = GetSystemMetrics(SM_CXSCREEN), sy = GetSystemMetrics(SM_CYSCREEN);
HDC hDC = GetDC(GetDesktopWindow());
HDC MyHDC = CreateCompatibleDC(hDC);
HBITMAP hBMP = CreateCompatibleBitmap(hDC, sx, sy);
SelectObject(MyHDC, hBMP);
LOGBRUSH MyBrush;
MyBrush.lbStyle = BS_SOLID;
MyBrush.lbColor = 0xFF0000;
HBRUSH hBrush = CreateBrushIndirect(&MyBrush);
RECT MyRect = {0, 0, sx, sy};
FillRect(MyHDC, &MyRect, hBrush);

BitBlt(MyHDC, 0, 0, sx, sy, hDC, 0, 0, SRCCOPY);
if(argc==2) CreateBMPFile(argv[1], CreateBitmapInfoStruct(hBMP), hBMP, MyHDC);

for(int i=0; i<argc; i++) printf("Argument #%d: %s\n", i, argv[i];);
printf(";Desktop DC = %d\nHBITMAP hBMP = %d", (int)hDC, (int)hBMP);
}

Ответить

Номер ответа: 2
Автор ответа:
 PeterS



Вопросов: 24
Ответов: 109
 Профиль | | #2 Добавлено: 01.04.05 23:25
А можно сразу в var, а не через промежуточные файлы, чтобы быстрее было???

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 01.04.05 23:40
Дык эээээ. В файл-то из переменной пишется, а не откуда-то с неба

Ответить

Номер ответа: 4
Автор ответа:
 cresta



Вопросов: 117
Ответов: 1538
 Профиль | | #4 Добавлено: 02.04.05 01:14
Выдели память необходимого размера: сумма размеров структур+размер самого Image (VirtualAlloc'ом) и вместо WriteFile скопируй в этот кусок памяти последовательно все хидеры и затем сами данные. Не забывая естественно, смещаться на уже записанную величину от начала переменной.

Ответить

Номер ответа: 5
Автор ответа:
 GSerg



Вопросов: 0
Ответов: 1876


 Профиль | | #5 Добавлено: 02.04.05 05:45
Option Explicit

Private Declare Function OleCreatePictureIndirect Lib "oleaut32" (ByRef lpPictDesc As PicBmp, riid As GUID, ByVal fOwn As Long, ByRef lplpvObj As Any) As Long
Private Declare Function BitBlt Lib "gdi32.dll" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function DeleteObject Lib "gdi32.dll" (ByVal hObject As Long) As Long
Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Type GUID
  ;Data1 As Long
  ;Data2 As Integer
  ;Data3 As Integer
  ;Data4(0 To 7) As Byte
End Type

Private Type PicBmp
  Size As Long
  Type As PictureTypeConstants
  hBmp As Long
  hPal As Long
  Reserved As Long
End Type

Private Function GetPicture(ByVal hBmp As Long) As IPictureDisp
  Dim p As PicBmp, g As GUID
  
  With p
    .hBmp = hBmp
    .Size = Len(p)
    .Type = vbPicTypeBitmap
  End With
  
  'IDispatch
  With g
    .Data1 = &H20400
    .Data4(0) = &HC0
    .Data4(7) = &H46
  End With
  
  OleCreatePictureIndirect p, g, 1, GetPicture
End Function

Private Function GetScreen(ByVal x As Long, ByVal y As Long, ByVal width As Long, ByVal height As Long) As IPictureDisp
  Dim h As Long, hd As Long, hb As Long
  
  h = GetDC(0)
  
  hd = CreateCompatibleDC(h)
  hb = CreateCompatibleBitmap(h, width, height)
  ;DeleteObject SelectObject(hd, hb)
  
  BitBlt hd, 0, 0, width, height, h, x, y, vbSrcCopy
  Set GetScreen = GetPicture(hb)
  
  ;DeleteObject hb
  ;DeleteDC hd
  ReleaseDC 0, h
End Function


Private Sub Form_Load()
  Dim p As IPictureDisp
  
  Set p = GetScreen(500, 400, 200, 200)
  
  Picture1.Picture = p
  Picture2.Picture = p
  Picture3.Picture = p
End Sub

Ответить

Номер ответа: 6
Автор ответа:
 PeterS



Вопросов: 24
Ответов: 109
 Профиль | | #6 Добавлено: 03.04.05 09:21
Чего-то ничего не получается!
Может ещё кто-нибудь поможет!!

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 03.04.05 12:54
Можно получить содержимое рисунка в байтовый массив с помощью GetBimapBits.

Ответить

Номер ответа: 8
Автор ответа:
 PeterS



Вопросов: 24
Ответов: 109
 Профиль | | #8 Добавлено: 04.04.05 14:22
Можно получить содержимое рисунка в байтовый массив с помощью GetBimapBits.

Получил, спасибо за это!

И теперь последнее: как этот массив передать через WinSock???

Ответить

Номер ответа: 9
Автор ответа:
 AgentFire



ICQ: 192496851 

Вопросов: 75
Ответов: 3178
 Профиль | | #9 Добавлено: 04.04.05 22:08
Private Type PicBmp
  Size As Long
  [B]Type[/B] As PictureTypeConstants
  hBmp As Long
  hPal As Long
  Reserved As Long
End Type


Конечно, не получается, нельзя использовать имя переменной как лючевое слово("Type";)

Передача через winsock(WS – rulezz):
Winsock1.Connect <IP>, <Port>
WinSock1.SendData <имя переменной>

Причем тип <имя переменной> должен быть тотже, что и <имя переменной> приема у клиента...

Ответить

Номер ответа: 10
Автор ответа:
 PeterS



Вопросов: 24
Ответов: 109
 Профиль | | #10 Добавлено: 04.04.05 22:37
Private Type PicBmp
  Size As Long
  [B]Type[/B] As PictureTypeConstants
  hBmp As Long
  hPal As Long
  Reserved As Long
End Type

Конечно, не получается, нельзя использовать имя переменной как лючевое слово("Type";)

Да с этим у меня всё в порядке, я уже загнал снимок в байтовый массив (как посоветовал CyRax).
Читать внимательнее надо!!!!

Я что по твоему не знаю как с винсоком работать.
Просто переменные передаются на ура!

А вот массив передать не получается.

Ответить

Номер ответа: 11
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 05.04.05 06:53
 MSDN:

object.SendData data

data
Data to be sent. For binary data, byte array should be used.

Ответить

Номер ответа: 12
Автор ответа:
 PeterS



Вопросов: 24
Ответов: 109
 Профиль | | #12 Добавлено: 05.04.05 11:36
И что?

Dim btData (1 to 250) As Byte
.................. (пусть массив будет заполнен)
WinSock.SendData btData
-------------------------

Dim btData (1 to 250) As Byte
WinSock.GetData btData ' и ничего толкового не приходит, а каждый элемент массива получается ноль.

Ответить

Номер ответа: 13
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 05.04.05 11:45
Попробуй динамический массив.

Ответить

Номер ответа: 14
Автор ответа:
 PeterS



Вопросов: 24
Ответов: 109
 Профиль | | #14 Добавлено: 05.04.05 12:41
Это как? Чего то я забыл!

Ответить

Номер ответа: 15
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #15
Добавлено: 05.04.05 12:48

Dim btData () As Byte
ReDim btData (249)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам