2011-07-30 5 views
0

cygwin gcc 컴파일러가 포함 된 Windows 7 servicepack 1 환경에서 작업하십시오.스크린 샷 프로그램이 작동하지 않습니다.

다음 프로그램은 스크린 샷을 찍은 다음 지정된 파일에 .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