2011-07-30 14 views
0

cygwin gccコンパイラを使用してWindows 7 servicepack 1環境で作業しています。Screenshot program not working

次のプログラムはスクリーンショットを作成し、指定したファイルに.bmpとして保存することになっています。それはうまくコンパイルされ、希望のディレクトリに.bmpファイルを与えるようだが、実行すると、そこにスクリーンショットデータのない1kbファイルしか作成されないようだ。 whileループの開始値にwhile(1)が指定されている場合は、「ビットマップファイルを作成できません」というエラーが返されます。私はこの種のプログラミングに慣れていないので、なぜこれが見えるのか分からない。

アイデア?

#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

プログラムは明らかにそれは、クリップボードから取得するビットマップデータを保存します。

コード(-lgdi32してコンパイルする必要があります)。クリップボードにデータがない場合は、空のビットマップのみを保存すると仮定します。また、.pngファイルではなく、 "Screenshot.bmp"というファイルを書き込みます。

ビットマップデータをクリップボードに書き込むには、まず印刷画面のボタンを押す必要があると想定します。これにより、スクリーンショットがクリップボードに保存されます。これで、このクリップボードのデータをファイルに保存することができます。

+0

優れています。これはお金の上に正しいようです。ただし、keybd_event(VK_SNAPSHOT、0x45、KEYEVENTF_EXTENDEDKEY、0)は使用しないでください。印刷画面ボタンが押されたのシミュレーションですか?実際には.bmpファイルが作成されていて、それは私の悪いことでした。 – Jeremy

+0

私は、Windowsのすべてのバージョンでkeybd_event()が期待通りに動作しない可能性があると仮定します。 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