Jump to content
Maximus

C++ screen shot

Recommended Posts

Posted

Am codul :

#include <windows.h>
#include <stdio.h>
#include <gdiplus.h>
#include <time.h>
#include <string.h>
#include <stdio.h>
#include <iostream>

using namespace std;
using namespace Gdiplus;


int GetEncoderClsid(WCHAR *format, CLSID *pClsid)
{
unsigned int num = 0, size = 0;
GetImageEncodersSize(&num, &size);
if(size == 0) return -1;
ImageCodecInfo *pImageCodecInfo = (ImageCodecInfo *)(malloc(size));
if(pImageCodecInfo == NULL) return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for(unsigned int j = 0; j < num; ++j){
if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0){
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}
free(pImageCodecInfo);
return -1;
}

int GetScreeny(LPWSTR lpszFilename, ULONG uQuality) // by Napalm
{
ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
HDC hdcCapture = CreateCompatibleDC(hdcScreen);
int nWidth = GetDeviceCaps(hdcScreen, HORZRES),
nHeight = GetDeviceCaps(hdcScreen, VERTRES),
nBPP = GetDeviceCaps(hdcScreen, BITSPIXEL);

LPBYTE lpCapture;
BITMAPINFO bmiCapture = { {
sizeof(BITMAPINFOHEADER), nWidth, -nHeight, 1, nBPP, BI_RGB, 0, 0, 0, 0, 0,
} };
HBITMAP hbmCapture = CreateDIBSection(hdcScreen, &bmiCapture,
DIB_PAL_COLORS, (LPVOID *)&lpCapture, NULL, 0);
if(!hbmCapture){
DeleteDC(hdcCapture);
DeleteDC(hdcScreen);
GdiplusShutdown(gdiplusToken);
return 1;
}

int nCapture = SaveDC(hdcCapture);
SelectObject(hdcCapture, hbmCapture);
BitBlt(hdcCapture, 0, 0, nWidth, nHeight, hdcScreen, 0, 0, SRCCOPY);
RestoreDC(hdcCapture, nCapture);
DeleteDC(hdcCapture);
DeleteDC(hdcScreen);

CLSID imageCLSID;
Bitmap *pScreenShot = new Bitmap(hbmCapture, (HPALETTE)NULL);
EncoderParameters encoderParams;
encoderParams.Count = 1;
encoderParams.Parameter[0].NumberOfValues = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParams.Parameter[0].Value = &uQuality;
GetEncoderClsid(L"image/jpeg", &imageCLSID);
int result = (pScreenShot->Save(lpszFilename, &imageCLSID, &encoderParams) == Ok);
delete pScreenShot;
DeleteObject(hbmCapture);
GdiplusShutdown(gdiplusToken);
return result;
}

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd)
{
// for (int count = 26; count > -1; count -= 2)
// {
return GetScreeny(L"screeny.jpg", 75);
// }
}

nu reusesc sa il fac sa faca screen la intervale de 10 min... nonstop pana dau kill la proces.

Va rog frumos sa ma ajutati. Multumesc frumos.

Posted (edited)

@cifratorul ; am incercat asa :


for (int count = 26; count > -1; count -= 2)
{
Sleep(19000);
return GetScreeny(L"screeny.jpg", 75);
}

pe langa alte variante.. si nu a mers.ce e drept, nu sun PRO, iar codul nu e facut de mine, e luat de pe google

@noVaLue ; sa inteleg ca nu am ce sa ai fac?

Edited by Maximus
Posted (edited)

Vezi daca poti compila...

#pragma comment(lib, "GdiPlus.lib")

#include <windows.h>
#include <iostream>
#include <gdiplus.h>
#include <time.h>

using namespace std;
using namespace Gdiplus;

struct timer {
long tStart, tTime, tStamp;
bool tAlive;
};

int GetEncoderClsid(WCHAR *format, CLSID *pClsid) {
unsigned int num = 0, size = 0;
GetImageEncodersSize(&num, &size);
if(size == 0) return -1;
ImageCodecInfo *pImageCodecInfo = (ImageCodecInfo *)(malloc(size));
if(pImageCodecInfo == NULL) return -1;
GetImageEncoders(num, size, pImageCodecInfo);
for(unsigned int j = 0; j < num; ++j){
if(wcscmp(pImageCodecInfo[j].MimeType, format) == 0){
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j;
}
}
free(pImageCodecInfo);
return -1;
}

int GetScreeny(LPWSTR lpszFilename, ULONG uQuality) // by Napalm
{
ULONG_PTR gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

HDC hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL);
HDC hdcCapture = CreateCompatibleDC(hdcScreen);
int nWidth = GetDeviceCaps(hdcScreen, HORZRES),
nHeight = GetDeviceCaps(hdcScreen, VERTRES),
nBPP = GetDeviceCaps(hdcScreen, BITSPIXEL);

LPBYTE lpCapture;
BITMAPINFO bmiCapture = { {
sizeof(BITMAPINFOHEADER), nWidth, -nHeight, 1, nBPP, BI_RGB, 0, 0, 0, 0, 0,
} };
HBITMAP hbmCapture = CreateDIBSection(hdcScreen, &bmiCapture,
DIB_PAL_COLORS, (LPVOID *)&lpCapture, NULL, 0);
if(!hbmCapture){
DeleteDC(hdcCapture);
DeleteDC(hdcScreen);
GdiplusShutdown(gdiplusToken);
return 1;
}

int nCapture = SaveDC(hdcCapture);
SelectObject(hdcCapture, hbmCapture);
BitBlt(hdcCapture, 0, 0, nWidth, nHeight, hdcScreen, 0, 0, SRCCOPY);
RestoreDC(hdcCapture, nCapture);
DeleteDC(hdcCapture);
DeleteDC(hdcScreen);

CLSID imageCLSID;
Bitmap *pScreenShot = new Bitmap(hbmCapture, (HPALETTE)NULL);
EncoderParameters encoderParams;
encoderParams.Count = 1;
encoderParams.Parameter[0].NumberOfValues = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParams.Parameter[0].Value = &uQuality;
GetEncoderClsid(L"image/jpeg", &imageCLSID);
int result = (pScreenShot->Save(lpszFilename, &imageCLSID, &encoderParams) == Ok);
delete pScreenShot;
DeleteObject(hbmCapture);
GdiplusShutdown(gdiplusToken);
return result;
}

bool pathExists(char *g_Path) {
return GetFileAttributes(g_Path) != INVALID_FILE_ATTRIBUTES;
}

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nShowCmd) {
char pathTF[128], pathTB[48], pathTBC[64];
wchar_t chToWCh[128];

int nextImg = 0;

timer CLK;

ZeroMemory(&pathTBC, sizeof(pathTBC));
ZeroMemory(&pathTB, sizeof(pathTB));
ZeroMemory(&pathTF, sizeof(pathTF));

GetCurrentDirectory(sizeof(pathTB), pathTB);

sprintf_s(pathTBC, sizeof(pathTBC), "%s/scr", pathTB);

if(!pathExists((char*)pathTBC))
CreateDirectory((char*)pathTBC, NULL);

CLK.tStart = clock();
CLK.tStamp = 0;
CLK.tAlive = true;

while(CLK.tAlive) {
CLK.tTime = clock() - CLK.tStart;

if(CLK.tTime > CLK.tStamp) {
sprintf_s(pathTF, sizeof(pathTF), "%s/screeny%d.jpg", pathTBC, nextImg);

while(pathExists((char*)pathTF)) {
nextImg++;
sprintf_s(pathTF, sizeof(pathTF), "%s/screeny%d.jpg", pathTBC, nextImg);
}

size_t newSize = strlen(pathTF) + 1;
size_t noConvChars = 0;
mbstowcs_s(&noConvChars, chToWCh, newSize, pathTF, _TRUNCATE);

GetScreeny((LPWSTR)chToWCh, 75);

CLK.tStamp += 10*60*1000;
}
Sleep(100);
}

return 0;
}

Edited by noVaLue
  • Upvote 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...