Скриншот программы не работает - PullRequest
0 голосов
/ 30 июля 2011

Работа в среде Windows 7 с пакетом обновления 1 с помощью компилятора cygwin gcc.

Предполагается, что следующая программа сделает снимок экрана и сохранит файл в формате .bmp в указанном файле.Он хорошо компилируется и, похоже, дает файл .bmp в нужном каталоге, но при запуске создается только файл размером 1 КБ без данных скриншота.Если циклу while задано начальное значение while (1), он выдаст ошибку «Unable to Create Bitmap File».Я новичок в этом виде программирования и не могу понять, почему это так.

Есть идеи?

(должно быть скомпилировано с -lgdi32)

code:

#include <stdlib.h>
#include <windows.h>
#include <stdio.h>

void TakeScreenShot(char* filename);

int main()
{
   TakeScreenShot("c:\\Screenshot.bmp");
   return 0;
}

//
// Side Effects:N/A
//
//This code is copyrighted and has// limited warranties.Please see http://
//   www.Planet-Source-Code.com/vb/scripts/Sh
//   owCode.asp?txtCodeId=10754&lngWId=3//for details.//**************************************
// 

void TakeScreenShot(char* filename)
{
   keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
   keybd_event(VK_SNAPSHOT, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
   HBITMAP h;        

   OpenClipboard(NULL);
   h = (HBITMAP)GetClipboardData(CF_BITMAP);
   CloseClipboard();
   HDC hdc=NULL;

   FILE*fp=NULL;
   LPVOID pBuf=NULL;
   BITMAPINFO bmpInfo;
   BITMAPFILEHEADER bmpFileHeader;

   do
   {
      hdc=GetDC(NULL);
      ZeroMemory(&bmpInfo,sizeof(BITMAPINFO));
      bmpInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
      GetDIBits(hdc,h,0,0,NULL,&bmpInfo,DIB_RGB_COLORS);

      if(bmpInfo.bmiHeader.biSizeImage<=0)
         bmpInfo.bmiHeader.biSizeImage=bmpInfo.bmiHeader.biWidth*abs(bmpInfo.bmiHeader.biHeight)*(bmpInfo.bmiHeader.biBitCount+7)/8;
      if((pBuf = malloc(bmpInfo.bmiHeader.biSizeImage))==NULL)
      {
         MessageBox( NULL, "Unable to Allocate Bitmap Memory", "Error", MB_OK|MB_ICONERROR);
         break;
      }
      bmpInfo.bmiHeader.biCompression=BI_RGB;
      GetDIBits(hdc,h,0,bmpInfo.bmiHeader.biHeight,pBuf, &bmpInfo, DIB_RGB_COLORS);

      if((fp = fopen(filename,"wb"))==NULL)
      {
         MessageBox(NULL, "Unable to Create Bitmap File", "Error", MB_OK|MB_ICONERROR);
         break;
      }

      bmpFileHeader.bfReserved1=0;
      bmpFileHeader.bfReserved2=0;
      bmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+bmpInfo.bmiHeader.biSizeImage;
      bmpFileHeader.bfType='MB';
      bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

      fwrite(&bmpFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
      fwrite(&bmpInfo.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
      fwrite(pBuf,bmpInfo.bmiHeader.biSizeImage,1,fp);
   }
   while(0);

   if(hdc)
      ReleaseDC(NULL,hdc);

   if(pBuf)
      free(pBuf);

   if(fp)
      fclose(fp);
}

1 Ответ

1 голос
/ 30 июля 2011

Программа, очевидно, сохраняет растровые данные, которые она получает из буфера обмена.Если в буфере обмена нет данных, я предполагаю, что он сохраняет только пустое растровое изображение.И он пишет файл с именем «Screenshot.bmp», а не файл .png.

Чтобы поместить растровые данные в буфер обмена, я предполагаю, что вы должны сначала нажать кнопку экрана печати.Это сохраняет скриншот в буфер обмена.Теперь программа может использоваться для сохранения данных буфера обмена в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...