c - 截图程序无法运行

标签 c

使用 cygwin gcc 编译器在 Windows 7 servicepack 1 环境中工作。

以下程序应该截取屏幕截图并将文件作为 .bmp 保存到指定的文件中。它编译得很好,似乎在所需的目录中给出了一个 .bmp 文件,但运行时似乎只创建了一个 1kb 文件,其中没有屏幕截图数据。如果 while 循环的起始值为 while(1),则会出现“无法创建位图文件”错误。我对这种编程很陌生,似乎不明白为什么会这样。

有什么想法吗?

(必须使用 -lgdi32 进行编译)

代码:

#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);
}

最佳答案

该程序显然保存了从剪贴板获取的位图数据。如果剪贴板上没有数据,我假设它只保存一个空位图。它会写入一个名为“Screenshot.bmp”的文件,而不是 .png 文件。

要将位图数据放入剪贴板,我假设您必须先按打印屏幕按钮。这会将屏幕截图保存到剪贴板。现在可以使用该程序将此剪贴板数据保存到文件中。

关于c - 截图程序无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880558/

相关文章:

c - 嵌入式linux中telnet的登录与管理

c - 如何创建结构数组的数组

C - 高效编码字符串生成算法

c - wait() 和 exit() 与父子进程

c++ - 如何在苹果的 AudioUnit 3D Mixer 上设置总线?

c++ - 为什么 c 和 c++ 对待未初始化变量的重新定义不同?

c++ - 在 C 编译器中,指针的大小始终等于 int 的大小。这是正确的吗?

c - 什么是 printf(),语句或表达式?为什么它与三元运算符一起工作?

c - 使用从 C 扩展返回的文件描述符来读取 python 中的文件

c - 优雅的错误检查