2024-02-13 21:00:46 +00:00
|
|
|
// Grabby.cpp : Defines the entry point for the application.
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include "Bitmap.h"
|
|
|
|
#include "Overlay.h"
|
|
|
|
#include "Grabby.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Print an error with a given context before bailing out
|
|
|
|
*/
|
|
|
|
void Die(LPTSTR lpContextMsg)
|
|
|
|
{
|
|
|
|
LPCTSTR lpszFmt = "%s: %s";
|
|
|
|
int iFullLen;
|
|
|
|
LPTSTR lpszError = NULL,
|
|
|
|
lpszFullMsg = NULL;
|
|
|
|
|
|
|
|
// The whole point of this is to print an actual message, so get the
|
|
|
|
// actual message
|
|
|
|
if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
|
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
|
|
NULL,
|
|
|
|
GetLastError(),
|
|
|
|
0,
|
|
|
|
(LPTSTR) &lpszError,
|
|
|
|
0,
|
|
|
|
NULL))
|
|
|
|
{
|
|
|
|
if (lpszError != NULL) LocalFree(lpszError);
|
|
|
|
lpszError = _T("unknown error");
|
|
|
|
}
|
|
|
|
|
|
|
|
iFullLen = _sctprintf(lpszFmt, lpContextMsg, lpszError);
|
|
|
|
lpszFullMsg = (LPTSTR) LocalAlloc(LPTR, sizeof(TCHAR) * (iFullLen + 1));
|
|
|
|
|
|
|
|
if (lpszFullMsg == NULL) {
|
|
|
|
// I'm honestly gonna guess if we get here, we're out of memory.
|
|
|
|
// So let's print what we have and bail
|
|
|
|
MessageBox(NULL,
|
|
|
|
lpContextMsg,
|
|
|
|
_T("Catastrophic Error"),
|
|
|
|
MB_OK | MB_ICONERROR);
|
|
|
|
} else {
|
|
|
|
_sntprintf(lpszFullMsg, iFullLen, lpszFmt, lpContextMsg, lpszError);
|
|
|
|
MessageBox(NULL,
|
|
|
|
lpszFullMsg,
|
|
|
|
_T("Fatal Error"),
|
|
|
|
MB_OK | MB_ICONERROR);
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: should we still be nice and free memory here?
|
|
|
|
ExitProcess(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
int APIENTRY _tWinMain(HINSTANCE hInstance,
|
|
|
|
HINSTANCE hPrevInstance,
|
|
|
|
LPTSTR lpCmdLine,
|
|
|
|
int nCmdShow)
|
|
|
|
{
|
2024-02-15 07:32:20 +00:00
|
|
|
SYSTEMTIME stNow = {0};
|
2024-02-13 21:00:46 +00:00
|
|
|
RECT capRegion = {0};
|
|
|
|
Screen *scrn = CreateScreen();
|
2024-02-15 07:32:20 +00:00
|
|
|
#define OUTPUT_DIR_LEN 96
|
|
|
|
TCHAR szOutputDir[OUTPUT_DIR_LEN + 1];
|
|
|
|
#define FULL_OUT_PATH_LEN OUTPUT_DIR_LEN + 24
|
|
|
|
TCHAR szFullOutPath[FULL_OUT_PATH_LEN + 1];
|
|
|
|
HRESULT hRes;
|
2024-02-13 21:00:46 +00:00
|
|
|
|
|
|
|
if (!scrn) {
|
|
|
|
Die("Couldn't get screen information");
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (CreateOverlay(hInstance, scrn)) {
|
|
|
|
case -1:
|
|
|
|
Die("Couldn't create overlay window");
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
/* Do nothing */
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
// User requested we cancel out, so do that
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
GetChosenRect(&capRegion);
|
|
|
|
|
2024-02-15 07:32:20 +00:00
|
|
|
if (!GetTempPath(OUTPUT_DIR_LEN, szOutputDir)) {
|
|
|
|
Die("Couldn't get temporary directory");
|
|
|
|
}
|
|
|
|
|
|
|
|
GetLocalTime(&stNow);
|
|
|
|
|
|
|
|
hRes = StringCchPrintf(szFullOutPath,
|
|
|
|
FULL_OUT_PATH_LEN,
|
|
|
|
"%s\\scrn_%04d%02d%02d_%02d%02d%02d.bmp",
|
|
|
|
szOutputDir,
|
|
|
|
stNow.wYear,
|
|
|
|
stNow.wMonth,
|
|
|
|
stNow.wDay,
|
|
|
|
stNow.wHour,
|
|
|
|
stNow.wMinute,
|
|
|
|
stNow.wSecond);
|
|
|
|
|
|
|
|
if (FAILED(hRes)) {
|
|
|
|
Die("Couldn't create screenshot file path");
|
|
|
|
}
|
2024-02-13 21:00:46 +00:00
|
|
|
|
2024-02-15 07:32:20 +00:00
|
|
|
if (WriteRegionToFile(scrn, &capRegion, szFullOutPath) == -1) {
|
2024-02-13 21:00:46 +00:00
|
|
|
Die("Couldn't grab region of the screen");
|
|
|
|
}
|
|
|
|
|
|
|
|
MessageBox(NULL,
|
|
|
|
_T("Successfully grabbed a part of the screen!"),
|
|
|
|
_T("\\o/"),
|
|
|
|
MB_OK | MB_ICONINFORMATION);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|