2011-07-30 144 views
0

使用cygwin gcc編譯器處理Windows 7 Service Pack 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); 
} 
+0

附加:似乎創建的.png文件無法用指示損壞的任何圖像查看軟件打開。 – Jeremy

回答

1

程序顯然保存它從剪貼板中得到位圖數據。如果剪貼板上沒有數據,我認爲它只保存一個空位圖。它寫入一個名爲「Screenshot.bmp」的文件,而不是一個.png文件。

要將位圖數據放在剪貼板上,我假設您必須先按下打印屏幕按鈕。這將截圖保存到剪貼板。現在,該程序可用於將此剪貼板數據保存到文件中。

+0

非常好。這似乎是對的錢。雖然不應該keybd_event(VK_SNAPSHOT,0x45,KEYEVENTF_EXTENDEDKEY,0);模擬按下的打印屏幕按鈕?它確實創建了一個.bmp文件,那是我的不好之處。 – Jeremy

+0

我假設keybd_event()可能無法按預期在所有版本的Windows上運行。 http://msdn.microsoft.com/en-us/library/ms646304%28v=vs.85%29.aspx說:**注意此功能已被取代。改用SendInput。**我從來沒有用過,但我想你應該調查這個功能。 –

+0

我已經在這個頁面上添加了SendInput函數:http://www.codeguru.com/forum/showthread.php?t=377393事情是當任何密鑰吸如VK_CAPITAL在那裏使用,它工作正常,但VK_SCREENSHOT選項是唯一一個看起來不能正常工作的人! – Jeremy