Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > MemoryDC


Автор: Step 3.12.2002, 18:53
у меня есть Указательна CDC как получить указатель на память где храниться изображение.

Автор: Andy_user 3.12.2002, 21:40
Не побрезгуйте куском кода...
Это функция, которая входит в серверную часть удаленного подглядывателя экрана.
Берет копию экрана и выдает через 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 4.12.2002, 01:28
Senk's

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)