@Limons

Как сохранить фотографию из bitmap?

В чём ошибка, просто уже устал.

#include <windows.h>
//#include <stdio.h>
#include <iostream>

#include <windef.h>

#include <gdiplus.h>

using namespace std;

#pragma comment(lib, "GdiPlus.lib") 
using namespace Gdiplus;

static const GUID png =
{ 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };

HWND hWnd = 0;
void screenShot(HWND hWnd);

void main() {
    HWND hWnd = FindWindowA("57558", 0);
    screenShot(hWnd);
}

void screenShot(HWND hWnd)
{
    HDC scrdc, memdc;
    HBITMAP membit;

    scrdc = GetDC(hWnd);

    RECT sizeWindow;
    GetWindowRect(hWnd, &sizeWindow);
    RECT test;
    cout << sizeWindow.left << " " << sizeWindow.top << " " << sizeWindow.right << " " << sizeWindow.bottom << endl;
    int w = sizeWindow.right - sizeWindow.left;
    int h = sizeWindow.bottom - sizeWindow.top - 16;

    memdc = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, w, h);
    SelectObject(memdc, membit);
    BitBlt(memdc, 0, 0, w, h, scrdc, 0, 0, SRCCOPY);
    HBITMAP hBitmap = membit;
    Gdiplus::Bitmap bitmap(hBitmap, NULL);

    bitmap.Save(L"C:\\screen.png", &png);
    DeleteObject(hBitmap);
}


Если всё таки не найдёте ошибки, то объясню суть:
Я пытаюсь сохранить скриншот окна по hwnd на диск C.
Можно ваш код, вместо моего
  • Вопрос задан
  • 358 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Limons Автор вопроса
Вообщем забросил я тот код и просто написал новый.
Я почти на 100% уверен, что ошибка была в неправильном использование Gdiplus -- GDI+ нового поколения, можете погуглить кому интересно, разобраться более подробно.

Вот код, который фоткает весь экран:
#include <windows.h>
#include <stdio.h>
#include <iostream>

#include <gdiplus.h>

using namespace std;

#pragma comment(lib, "GdiPlus.lib") 
using namespace Gdiplus; 


static const GUID png =
{ 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };


int main()
{
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    HDC scrdc, memdc;
    HBITMAP membit;

    scrdc = GetDC(0);
    int Height, Width;
    Height = GetSystemMetrics(SM_CYSCREEN);
    Width = GetSystemMetrics(SM_CXSCREEN);

    memdc = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, Width, Height);
    SelectObject(memdc, membit);

    BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
    HBITMAP hBitmap;
    hBitmap = (HBITMAP)SelectObject(memdc, membit);
    Gdiplus::Bitmap bitmap(hBitmap, NULL);
    bitmap.Save(L"c:\screen.png", &png);

    DeleteObject(hBitmap);
    //GdiplusShutdown(gdiplusToken); не моуг понять, но происходит нарушение прав доступа. Вероятно  gdiplusToken удаляется какой-то функцией, самоуничтожается в плане.
    return 0;
}


Вот код, который фоткает лишь окно какого-либо приложения по HWND:
#include <windows.h>
#include <stdio.h>
#include <iostream>

#include <gdiplus.h>

using namespace std;

#pragma comment(lib, "GdiPlus.lib") 
using namespace Gdiplus; 


static const GUID png =
{ 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };

void screenShote(HWND hWnd);

int main()
{
    HWND hWnd = FindWindowA("Класс", "Заголовок"); // можно поставить 0 вместо заголвка или класса окна, тогда будет выполнен поиск только по одному из аргументов
    screenShote(hWnd);
    return 0;
}

void screenShote(HWND hWnd) {
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    HDC scrdc, memdc;
    HBITMAP membit;

    scrdc = GetDCEx(hWnd, 0, DCX_WINDOW);
    int Height, Width;
    RECT sizeWindow;
    GetWindowRect(hWnd, &sizeWindow);

    Height = sizeWindow.bottom - sizeWindow.top;
    Width = sizeWindow.right - sizeWindow.left;

    memdc = CreateCompatibleDC(scrdc);
    membit = CreateCompatibleBitmap(scrdc, Width, Height);
    SelectObject(memdc, membit);

    BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
    HBITMAP hBitmap;
    hBitmap = (HBITMAP)SelectObject(memdc, membit);
    Gdiplus::Bitmap bitmap(hBitmap, NULL);
    bitmap.Save(L"c:\\screen.png", &png);

    DeleteObject(hBitmap);
    //GdiplusShutdown(gdiplusToken); не моуг понять, но происходит нарушение прав доступа. Вероятно  gdiplusToken удаляется какой-то функцией, самоуничтожается в плане.
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы