Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MemoryDC, как извлечь данные из буфера памяти 
:(
    Опции темы
Step
Дата 3.12.2002, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



у меня есть Указательна CDC как получить указатель на память где храниться изображение.


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Andy_user
Дата 3.12.2002, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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; // завершение потока
}
//==============================================
PM MAIL   Вверх
Step
Дата 4.12.2002, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: 5
Всего: 25



Senk's


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0399 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.