Как сфотографировать экран рабочего стола Windows?
От: Orifiel  
Дата: 03.04.03 11:53
Оценка:
Идея в следующем. Необходимо в моменты времени, определенные таймером, фотографировать
экран рабочего стола с последующим сохранением в формате *.bmp. Как вы наверно догадались,
проектируется Spy-программа.
Re: Как сфотографировать экран рабочего стола Windows?
От: Demon Россия  
Дата: 03.04.03 12:14
Оценка:
Здравствуйте, Orifiel, Вы писали:

O>Идея в следующем. Необходимо в моменты времени, определенные таймером, фотографировать

O>экран рабочего стола с последующим сохранением в формате *.bmp.

GetDC( NULL );
быстренько скидываешь это в свой буфер, а потом в файл.
Re: Как сфотографировать экран рабочего стола Windows?
От: algol Россия about:blank
Дата: 03.04.03 13:06
Оценка: 24 (1)
Здравствуйте, Orifiel, Вы писали:

O>Идея в следующем. Необходимо в моменты времени, определенные таймером, фотографировать

O>экран рабочего стола с последующим сохранением в формате *.bmp.

Однако тут цифровой фотоаппарат нужен...

Вот пример с использованием GDI+, только он сохраняет в GIF, но это легко поправить. Инициализацию GDI+ и получение CLSID кодека лучше вынести в основную программу.
Если неохота связываться с GDI+ и BMP вполне устраивает, то поищи на сайте сообщение о сохранении в BMP с помощью OleSavePictureFile().
А вообще — баловство все это для детского сада и лучше такой чушью не заниматься.
#include <GdiPlus.h>
using namespace Gdiplus;
#include <wchar.h>
int GetCodecClsid(const WCHAR* format, CLSID* pClsid); 

    LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
    {
        RECT r;
        ::GetWindowRect(GetDesktopWindow(), &r);
        HDC dc = ::GetWindowDC(0);
        HDC memDC = ::CreateCompatibleDC(dc);

        HBITMAP bm = ::CreateCompatibleBitmap(dc, r.right-r.left, r.bottom-r.top);
        HBITMAP oldbm = (HBITMAP) ::SelectObject(memDC, bm);
        ::BitBlt(memDC, 0, 0, r.right-r.left, r.bottom-r.top, dc, 0, 0, SRCCOPY);
        ::ReleaseDC(0, dc);
        ::SelectObject(memDC, oldbm);
        ::DeleteDC(memDC);

        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR           gdiplusToken;

        // Initialize GDI+
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
        {
        Bitmap img(bm, NULL);
        wchar_t fn[80];
        swprintf(fn, L"img%04d.gif", cnt++);
        CLSID gifClsid;
        int result = GetCodecClsid(L"image/gif", &gifClsid);
        img.Save(fn, &gifClsid);
        }
        GdiplusShutdown(gdiplusToken);

        return 0;
    }

int GetCodecClsid(const WCHAR* format, CLSID* pClsid)
{
   UINT  num = 0;          // number of image encoders
   UINT  size = 0;         // size of the image encoder array in bytes

   ImageCodecInfo* pImageCodecInfo = NULL;

   GetImageEncodersSize(&num, &size);
   if(size == 0)
      return -1;  // Failure

   pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
   if(pImageCodecInfo == NULL)
      return -1;  // Failure

   GetImageEncoders(num, size, pImageCodecInfo);

   for(UINT j = 0; j < num; ++j)
   {
      if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
      {
         *pClsid = pImageCodecInfo[j].Clsid;
         return j;  // Success
      }    
   } // for

   return -1;  // Failure

} // GetCodecClsid
Re[2]: Как сфотографировать экран рабочего стола Windows?
От: Orifiel  
Дата: 03.04.03 13:52
Оценка: -1
Здравствуйте, algol, Вы писали:

A>Здравствуйте, Orifiel, Вы писали:


O>>Идея в следующем. Необходимо в моменты времени, определенные таймером, фотографировать

O>>экран рабочего стола с последующим сохранением в формате *.bmp.

A>Однако тут цифровой фотоаппарат нужен...


A>Вот пример с использованием GDI+, только он сохраняет в GIF, но это легко поправить. Инициализацию GDI+ и получение CLSID кодека лучше вынести в основную программу.

A>Если неохота связываться с GDI+ и BMP вполне устраивает, то поищи на сайте сообщение о сохранении в BMP с помощью OleSavePictureFile().
A>А вообще — баловство все это для детского сада и лучше такой чушью не заниматься.
A>[ccode]
A>#include <GdiPlus.h>
A>using namespace Gdiplus;
A>#include <wchar.h>
A>int GetCodecClsid(const WCHAR* format, CLSID* pClsid);

A> LRESULT OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)

A> {
A> RECT r;
A> ::GetWindowRect(GetDesktopWindow(), &r);
A> HDC dc = ::GetWindowDC(0);
A> HDC memDC = ::CreateCompatibleDC(dc);

A> HBITMAP bm = ::CreateCompatibleBitmap(dc, r.right-r.left, r.bottom-r.top);

A> HBITMAP oldbm = (HBITMAP) ::SelectObject(memDC, bm);
A> ::BitBlt(memDC, 0, 0, r.right-r.left, r.bottom-r.top, dc, 0, 0, SRCCOPY);
A> ::ReleaseDC(0, dc);
A> ::SelectObject(memDC, oldbm);
A> ::DeleteDC(memDC);

A> GdiplusStartupInput gdiplusStartupInput;

A> ULONG_PTR gdiplusToken;

A> // Initialize GDI+

A> GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
A> {
A> Bitmap img(bm, NULL);
A> wchar_t fn[80];
A> swprintf(fn, L"img%04d.gif", cnt++);
A> CLSID gifClsid;
A> int result = GetCodecClsid(L"image/gif", &gifClsid);
A> img.Save(fn, &gifClsid);
A> }
A> GdiplusShutdown(gdiplusToken);

A> return 0;

A> }

A>int GetCodecClsid(const WCHAR* format, CLSID* pClsid)

A>{
A> UINT num = 0; // number of image encoders
A> UINT size = 0; // size of the image encoder array in bytes

A> ImageCodecInfo* pImageCodecInfo = NULL;


A> GetImageEncodersSize(&num, &size);

A> if(size == 0)
A> return -1; // Failure

A> pImageCodecInfo = (ImageCodecInfo*)(malloc(size));

A> if(pImageCodecInfo == NULL)
A> return -1; // Failure

A> GetImageEncoders(num, size, pImageCodecInfo);


A> for(UINT j = 0; j < num; ++j)

A> {
A> if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
A> {
A> *pClsid = pImageCodecInfo[j].Clsid;
A> return j; // Success
A> }
A> } // for

A> return -1; // Failure


A>} // GetCodecClsid

A>Отнють не для детского сада. Программа разрабатывается для компьютеров, содержащих информацию для служебного пользования. Поэтому очень неплохо было бы видеть, кто и где копается. А вообще, не все ли равно, что програмить.
Re[3]: Как сфотографировать экран рабочего стола Windows?
От: algol Россия about:blank
Дата: 03.04.03 14:40
Оценка:
Здравствуйте, Orifiel, Вы писали:

A>>Отнють не для детского сада. Программа разрабатывается для компьютеров, содержащих информацию для служебного пользования. Поэтому очень неплохо было бы видеть, кто и где копается.


Понятно, а скриншоты автоматом уходят за бугор нашим братьям по разуму.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.