Страница: 1 | 2 |
Вопрос: Как снимок экрана поместить в пе
Добавлено: 01.04.05 22:53
Автор вопроса: PeterS
Всем доброго времени суток!
Подскажите, пожалуйста, как поместить снимок экрана, сделанный с помощью BitBlt (наверное многие изучали этот пример с помещением снимка на форму), в переменную?
Или может использовать другие функции. В общем нужен пример или дельный совет!
Спасибо за внимание!
Ответы
Всего ответов: 19
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 01.04.05 23:21
Прога для делания скриншотов на C++ моего и MSDN изготовления
#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
 WORD dwTotal; // total count of bytes
 WORD cb; // incremental count of bytes
BYTE *hp; // byte pointer
 WORD 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("esktop 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-сайт:
Профиль | | #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
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
 ata1 As Long
 ata2 As Integer
 ata3 As Integer
 ata4(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)
 eleteObject SelectObject(hd, hb)
BitBlt hd, 0, 0, width, height, h, x, y, vbSrcCopy
Set GetScreen = GetPicture(hb)
 eleteObject hb
 eleteDC 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-сайт:
Профиль | | #7
Добавлено: 03.04.05 12:54
Можно получить содержимое рисунка в байтовый массив с помощью GetBimapBits.
Номер ответа: 8
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #8
Добавлено: 04.04.05 14:22
Получил, спасибо за это!
И теперь последнее: как этот массив передать через WinSock???
Номер ответа: 9
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #9
Добавлено: 04.04.05 22:08
Size As Long
[B]Type[/B] As PictureTypeConstants
hBmp As Long
hPal As Long
Reserved As Long
End Type
Конечно, не получается, нельзя использовать имя переменной как лючевое слово("Type"
Передача через winsock(WS – rulezz):
WinSock1.SendData <имя переменной>
Причем тип <имя переменной> должен быть тотже, что и <имя переменной> приема у клиента...
Номер ответа: 10
Автор ответа:
PeterS
Вопросов: 24
Ответов: 109
Профиль | | #10
Добавлено: 04.04.05 22:37
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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #15
Добавлено: 05.04.05 12:48
Dim btData () As Byte
ReDim btData (249)