Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 |

 

  Вопрос: Как сделать снимок экрана ??? Добавлено: 24.08.07 19:29  

Автор вопроса:  Pro100Vlad
Как сделать снимок экрана и сохранить его в (bmp или jpeg) ???

Ответить

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

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 24.08.07 20:47
BMP

#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
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #2
Добавлено: 25.08.07 14:26
Как всегда

Ответить

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



Вопросов: 3
Ответов: 29
 Профиль | | #3 Добавлено: 25.08.07 16:41
Шарп много текста но не сюда .Откуда человек спрашівающий такие вещи может знать C++ а ише перевести все ето на свой язык

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 25.08.07 17:25
Если человек не способен заметить в коде на любом языке названия API-функций, по которым можно гуглить и мсднить, то человеку никто не поможет.

Ответить

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



ICQ: 496782368 

Вопросов: 18
Ответов: 312
 Web-сайт: starsorion.com
 Профиль | | #5
Добавлено: 25.08.07 18:37
Ну вот по заявкам радиослушателей на своём языке:))
Private Declare Function BitBlt Lib "gdi32" (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 GetDesktopWindow Lib "user32" () As Long
Private Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hWnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long
Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc 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 nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Const SM_CXSCREEN = 0 'X Size of screen
Const SM_CYSCREEN = 1 'Y Size of Screen
Const SM_CYBORDER = 6
Private Const SM_CYCAPTION = 4
Dim freevalue As Variant

Private Sub getdesk()
Dim hwndSrc As Long
Dim dwRop As Long
Dim hSrcDC As Long
dwRop = &HCC0020
hwndSrc = GetDesktopWindow()
hSrcDC = GetDC(hwndSrc)
freevalue = BitBlt(StdPicture.hdc, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), hSrcDC, 0, 0, dwRop)
freevalue = ReleaseDC(hwndSrc, hSrcDC)
Pictures.Picture = StdPicture.Image
End Sub
Private Sub Command1_Click()
getdesk
SavePicture Pictures.Picture, "c:\111.bmp"
End Sub

Полностью работоспособный код...
Добавляем на форму 2 PictureBox и одну кнопку(Pictures и StdPicture и Command1)

С мелочами думаю разберёшься...

Ответить

Номер ответа: 6
Автор ответа:
 VβÐUηìt



Вопросов: 246
Ответов: 3333
 Web-сайт: смекаешь.рф
 Профиль | | #6
Добавлено: 25.08.07 19:55
Если человек не способен заметить в коде на любом языке названия API-функций, по которым можно гуглить и мсднить, то человеку никто не поможет.

Sharp, когда я впервые увидел код С++, я упал в обморок. Только потом привык, и уже что-то понял. Но ведь многие незнают даже основы С++ (типа int p;). Так что по себе не судят.

P.S. Помните, у меня был вседостающий вопрос "Запомнить BitBlt"? Мне как-раз нужен был этот код, но мне опять же отправляли примеры на С.

Ответить

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



Администратор

ICQ: 201502381 

Вопросов: 15
Ответов: 737
 Профиль | | #7 Добавлено: 26.08.07 02:02
Не нравится, пиши на .NET. А раз выбрал VB6, буть добр уметь читать msdn, в котором, о боже, все примеры на C++!

Ответить

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



Вопросов: 4
Ответов: 11
 Профиль | | #8 Добавлено: 26.08.07 22:30
Pictures.Picture = StdPicture.Image
эта строчка не работает.
сохраняет серый рисунок.

Ответить

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



ICQ: 496782368 

Вопросов: 18
Ответов: 312
 Web-сайт: starsorion.com
 Профиль | | #9
Добавлено: 27.08.07 21:03
StdPicture.AutoRedraw=true

Ответить

Номер ответа: 10
Автор ответа:
 Александр



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

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #10 Добавлено: 28.08.07 21:46
Как всегда

Ну Шарп у нас такой :)

Шарп много текста но не сюда .Откуда человек спрашівающий такие вещи может знать C++ а ише перевести все ето на свой язык

А смысл ему тогда искать в MSDN, если там все примеры почти на C++? Да и в примере чистый api находится. Знай переводи объявления на vb и чуток переписывай код под синтаксис vb6.

Ответить

Страница: 1 |

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



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