游戏截屏(解决游戏答题思路的一种) [C++]

CRect GameRect;//保存游戏窗口矩形用

 if (theApp.m_hGameHand !=NULL)//这个需要自己去保存游戏窗口句柄我保存在theApp.m_hGameHand 里

 {

  ::ShowWindow(theApp.m_hGameHand,SW_SHOW);//把游戏显示出来

  ::PostMessage(theApp.m_hGameHand,WM_SYSCOMMAND,SC_RESTORE,0);//防止游戏最小化,

  Sleep(200);//防止游戏窗口未弹出

  

  //让游戏窗口置顶

  ::SetWindowPos(theApp.m_hGameHand,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);

  //获取游戏窗口的坐标

  ::GetWindowRect(theApp.m_hGameHand,&GameRect);

  

  //把游戏窗口移动到屏幕中间位置防止被覆盖窗体,被覆盖的DC是无法截取的

  int x = ((GetSystemMetrics(SM_CXSCREEN)-GameRect.Width())/2);

  int y = ((GetSystemMetrics(SM_CYSCREEN)-GameRect.Height())/2);

  ::MoveWindow(theApp.m_hGameHand,x,y,GameRect.Width(),GameRect.Height(),TRUE);

  

  //根据游戏窗口句柄获得游戏HDC

  HDC hSr = ::GetDC(theApp.m_hGameHand);

  //创建一个与游戏HDC兼容的HDC

  HDC   hdc=::CreateCompatibleDC(hSr);  

  //创建一个与游戏HDC兼容的图位 大小为游戏窗口大小

  HBITMAP   hbmp=::CreateCompatibleBitmap(hSr,GameRect.Width(),GameRect.Height());  

  ::SelectObject(hdc,(HGDIOBJ)hbmp);  

  

  //::StretchBlt(hdc,0,0,GameRect.Width(),GameRect.Height(),hSr,0,0,GameRect.Width(),GameRect.Height(),SRCCOPY);  

  ::BitBlt(hdc,0,0,GameRect.Width(),GameRect.Height(),hSr,0,0,SRCCOPY|SRCPAINT);  

  //保存成图片,这里可以改成发送图片数据到远程机器,

  CBmp::SaveBmp(hbmp,"c:\\Test.bmp");//自己个bmp保存的函数好了,构建一个bmp文件头然后接上数据

  ::ReleaseDC(theApp.m_hGameHand,hSr);

  ::ReleaseDC(this->m_hWnd,hdc);

  DeleteObject(hbmp);

  ::DeleteDC(hSr);

  ::DeleteDC(hdc); 

  //取消置顶窗口

  ::SetWindowPos(theApp.m_hGameHand,HWND_TOPMOST,0,0,0,0,~SWP_NOSIZE|~SWP_NOMOVE);  }

你可能感兴趣的:(C++)