![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
у меня есть Указательна CDC как получить указатель на память где храниться изображение.
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| Andy_user |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 40 Регистрация: 5.7.2002 Где: Санкт-Петербург Репутация: нет Всего: 2 |
Не побрезгуйте куском кода...
Это функция, которая входит в серверную часть удаленного подглядывателя экрана. Берет копию экрана и выдает через Socket в виде потока. Точно также можно положить в файл. #include <windows.h> #include <stdio.h> #include <wingdi.h> #include <winsock.h> #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused //============================================================== // Function ConnectThread // Поток для обслуживания соединения и выдачи через Socket // картинки экрана удаленного компьютера (без сжатия) // Получает команду: get screen // Выдает: 4 байта - длина блока BitmapInfo // ???? байтов - блок BitmapInfo // 4 байта - длина блока Image // ???? байтов - блок Image //============================================================== DWORD WINAPI ConnectThread(LPVOID lpParam) { SOCKET sockConnect = (SOCKET)lpParam; CHAR recvbuff[256]; // приемный буфер CHAR textarray[200]; // для отладки DWORD left; // сколько байт из 10 осталось DWORD ret; DWORD indx; DWORD xx; DWORD yy; HWND hwnd_screen; HDC hdc_screen; HDC hdc_mem; HBITMAP hbitmap; HBITMAP holdbitmap; BITMAPINFO bmi; HGLOBAL hglobal; CHAR * point; CHAR * point_temp; DWORD * pointdword; CHAR * pointchar; DWORD i; // for //------------------ left = 10; // 10 байт - длина команды "get screen" indx = 0; // на первый байт буфера while (left>0){ ret = recv(sockConnect,&recvbuff[indx],left,0); if (ret != SOCKET_ERROR) { indx = indx + ret; // indx += ret; left = left - ret; // left -= ret; }; };// end of while(left>0) if (strncmp(recvbuff,"get screen",10)==0) { // Command "get screen" // Надо выслать BITMAPINFO и массив, содержащий растр экрана xx = GetSystemMetrics(SM_CXSCREEN); yy = GetSystemMetrics(SM_CYSCREEN); hwnd_screen = GetDesktopWindow(); hdc_screen = GetWindowDC(hwnd_screen); hdc_mem = CreateCompatibleDC(hdc_screen); hbitmap = CreateCompatibleBitmap(hdc_screen,xx,yy); holdbitmap = SelectObject(hdc_mem,hbitmap); BitBlt(hdc_mem,0,0,xx,yy,hdc_screen,0,0,SRCCOPY); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = xx; bmi.bmiHeader.biHeight = yy; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biCompression = 0; GetDIBits(hdc_mem,hbitmap,0,yy,NULL,& bmi,DIB_RGB_COLORS); hglobal = GlobalAlloc(0,bmi.bmiHeader.biSizeImage); point = (CHAR *)GlobalLock(hglobal); GetDIBits(hdc_mem,hbitmap,0,yy,point,& bmi,DIB_RGB_COLORS); //=== Send length of bmi (4 bytes) === pointdword = & recvbuff[0]; * pointdword = (DWORD) sizeof(bmi); left = 4; // 4 байта - длина bmi indx = 0; // на первый байт буфера while (left>0){ ret = send(sockConnect,&recvbuff[indx],left,0); if (ret != SOCKET_ERROR) { indx = indx + ret; // indx += ret; left = left - ret; // left -= ret; }; };// end of while(left>0) //=== Rewrite === pointchar = & bmi; for (i=0;i<sizeof(bmi);i++) {// перепись recvbuff[i] = * pointchar; pointchar ++; }; // end for //=== Send bmi === left = sizeof (bmi); // длина bmi indx = 0; // на первый байт буфера while (left>0){ ret = send(sockConnect,&recvbuff[indx],left,0); if (ret != SOCKET_ERROR) { indx = indx + ret; // indx += ret; left = left - ret; // left -= ret; }; };// end of while(left>0) //=== Send length of Image (4 bytes) === pointdword = & recvbuff[0]; * pointdword = (DWORD) bmi.bmiHeader.biSizeImage; left = 4; // 4 байта - длина bmi indx = 0; // на первый байт буфера while (left>0){ ret = send(sockConnect,&recvbuff[indx],left,0); if (ret != SOCKET_ERROR) { indx = indx + ret; // indx += ret; left = left - ret; // left -= ret; }; };// end of while(left>0) //=== Send Image (great count of bytes) === left = bmi.bmiHeader.biSizeImage; // длина Image indx = 0; // на первый байт буфера while (left>0){ ret = send(sockConnect,point+indx,left,0); if (ret != SOCKET_ERROR) { indx = indx + ret; // indx += ret; left = left - ret; // left -= ret; }; };// end of while(left>0) GlobalUnlock(hglobal); GlobalFree(hglobal); SelectObject(hdc_mem,holdbitmap); DeleteObject(hbitmap); DeleteDC(hdc_mem); ReleaseDC(hwnd_screen,hdc_screen);// free contex }; // end command "get screen" closesocket(sockConnect); return 0; // завершение потока } //============================================== |
|||
|
||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
Senk's
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |