Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/91: Рейтинг темы: голосов - 91, средняя оценка - 4.64
90 / 17 / 4
Регистрация: 09.06.2010
Сообщений: 100

Как сделать скриншот экрана?

03.04.2011, 21:47. Показов 18951. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1. Программа через равные промежутки времени (2...5 сек) должна делать скриншот и сохранять его в любом формате, файл постоянно перезаписывается.
2. Возможно ли, чтобы делался скрин рабочей области активного на данный момент окна? Или лучше делать полный скрин и потом его обрезать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2011, 21:47
Ответы с готовыми решениями:

Как сделать, чтоб окружность не улетала за пределы экрана, а ударялась об края
#include <graphics.h> #include <conio.h> #include <stdio.h> #include <dos.h> #define dt 20 // zamedlenie #define dx 10 // x step ...

Как сделать скриншот экрана (просто скрин полного экрана) и сохранить изображение в определённую папку?
Как сделать скриншот экрана (просто скрин полного экрана) и сохранить изображение в определённую папку? Программа без кнопок просто...

Как сделать скриншот экрана?
Как сделать скриншот экрана (допустим, 200 на 300px, по координатам x: 150, y: 20) и поместить его в image?

34
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.04.2011, 08:50
Студворк — интернет-сервис помощи студентам
Но в коде же его нет. А если делать через него то зачем копирожать из одного контекста в другой? Или BITMAP можно построить только по контексту памяти? Задача была скопировать на диск, ты предлагаешь через битмап, ну так объясни, как, имея контекст устройства, получить битмап, а не копию контекста.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
05.04.2011, 08:58
Здесь задача не просто битмап построить, а сделать скриншот. Так что от контекста устройства никуда не деться. Зачем копируют? А вот х/з, я этот код скопипастил.) Видимо из расчёта ещё каких-то модификаций.
Цитата Сообщение от taras atavin Посмотреть сообщение
контекст устройства, получить битмап
ТС сам дал ссылку на то, как его получить.
Специально для тебя я продублировал ссылку на функцию GetObject. Получай на здоровье.)

Добавлено через 3 минуты
Хм... А разве можно создать картинку из контекста без копирования? Я чёт не знаю.)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
05.04.2011, 09:03
Цитата Сообщение от Deviaphan Посмотреть сообщение
м... А разве можно создать картинку из контекста без копирования? Я чёт не знаю.)
Но ты скопировал не в битмап, а в другой контекст. Объясни явно и просто, почему в битмап можно копировать только контекст памяти, но не контекст устройства.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
05.04.2011, 09:05
Я копировал не в другой контекст, а в битмап связанный с контекстом.
Что за контекст памяти?
0
90 / 17 / 4
Регистрация: 09.06.2010
Сообщений: 100
09.04.2011, 11:09  [ТС]
Огого нафлудили, пока меня не было... Возможно стоит немного поправить задания?
1. Я то думал сохранить скрин, чтобы его потом анализировать на предмет цвета разных пикселей. Но ведь наверное можно анализ делать и не сохраняя картинку как файл, хотя с сохранением я могу увидеть, с какой конкретно картинкой идёт работа (и потом сохранение закомментить).
2. К примеру есть qip, открываем окно любого контакта, это окно и нужно сохранять. Как лучше - держать его всегда активным, или можно как то по хендлу окна скринить его (при любом другом активном)?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 12:01
Для чего цвет пикселей анализировать?
Тем более у программы со скинами?
0
41 / 41 / 9
Регистрация: 28.01.2011
Сообщений: 175
09.04.2011, 12:06
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
int CaptureBMP(LPCTSTR szFile)
{
    // Source[1]
    HDC hdcScr, hdcMem;
    HBITMAP hbmScr;
    BITMAP bmp;
    int iXRes, iYRes;
 
    // Create a normal DC and a memory DC for the entire screen. The
    // normal DC provides a "snapshot" of the screen contents. The
    // memory DC keeps a copy of this "snapshot" in the associated
    // bitmap.
    hdcScr = CreateDC("DISPLAY", NULL, NULL, NULL);
    hdcMem = CreateCompatibleDC(hdcScr);
 
    iXRes = GetDeviceCaps(hdcScr, HORZRES);
    iYRes = GetDeviceCaps(hdcScr, VERTRES);
 
    // Create a compatible bitmap for hdcScreen.
    hbmScr = CreateCompatibleBitmap(hdcScr, iXRes, iYRes);
    if (hbmScr == 0) return 0;
 
    // Select the bitmaps into the compatible DC.
    if (!SelectObject(hdcMem, hbmScr)) return 0;
 
    // Copy color data for the entire display into a
    // bitmap that is selected into a compatible DC.
    if (!StretchBlt(hdcMem,
        0, 0, iXRes, iYRes,
        hdcScr,
        0, 0, iXRes, iYRes,
        SRCCOPY))
 
        return 0;
 
    // Source[2]
    PBITMAPINFO pbmi;
    WORD cClrBits;
 
    // Retrieve the bitmap's color format, width, and height.
    if (!GetObject(hbmScr, sizeof(BITMAP), (LPSTR) &bmp)) return 0;
 
    // Convert the color format to a count of bits.
    cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
    if (cClrBits == 1)
        cClrBits = 1;
    else if (cClrBits <= 4)
        cClrBits = 4;
    else if (cClrBits <= 8)
        cClrBits = 8;
    else if (cClrBits <= 16)
        cClrBits = 16;
    else if (cClrBits <= 24)
        cClrBits = 24;
    else cClrBits = 32;
 
    // Allocate memory for the BITMAPINFO structure. (This structure
    // contains a BITMAPINFOHEADER structure and an array of RGBQUAD
    // data structures.)
    if (cClrBits != 24)
        pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
                sizeof(BITMAPINFOHEADER) +
                sizeof(RGBQUAD) * (1 << cClrBits));
 
    // There is no RGBQUAD array for the 24-bit-per-pixel format.
    else
        pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
                sizeof(BITMAPINFOHEADER));
 
    // Initialize the fields in the BITMAPINFO structure.
    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = bmp.bmWidth;
    pbmi->bmiHeader.biHeight = bmp.bmHeight;
    pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
    pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
    if (cClrBits < 24)
        pbmi->bmiHeader.biClrUsed = (1 << cClrBits);
 
    // If the bitmap is not compressed, set the BI_RGB flag.
    pbmi->bmiHeader.biCompression = BI_RGB;
 
    // Compute the number of bytes in the array of color
    // indices and store the result in biSizeImage.
    pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) / 8
                                    * pbmi->bmiHeader.biHeight * cClrBits;
 
    // Set biClrImportant to 0, indicating that all of the
    // device colors are important.
    pbmi->bmiHeader.biClrImportant = 0;
 
    HANDLE hf;                  // file handle
    BITMAPFILEHEADER hdr;       // bitmap file-header
    PBITMAPINFOHEADER pbih;     // bitmap info-header
    LPBYTE lpBits;              // memory pointer
    DWORD dwTotal;              // total count of bytes
    DWORD cb;                   // incremental count of bytes
    BYTE *hp;                   // byte pointer
    DWORD dwTmp;
 
    pbih = (PBITMAPINFOHEADER) pbmi;
    lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
 
    if (!lpBits) return 0;
 
    // Retrieve the color table (RGBQUAD array) and the bits
    // (array of palette indices) from the DIB.
    if (!GetDIBits(hdcMem, hbmScr, 0, (WORD) pbih->biHeight, lpBits, pbmi, DIB_RGB_COLORS)) return 0;
 
    // Create the .BMP file.
    hf = CreateFile(szFile,
                    GENERIC_READ | GENERIC_WRITE,
                    (DWORD) 0,
                    NULL,
                    CREATE_ALWAYS,
                    FILE_ATTRIBUTE_NORMAL,
                    (HANDLE) NULL);
    if (hf == INVALID_HANDLE_VALUE) return 0;
 
    hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"
 
    // Compute the size of the entire file.
    hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
                 pbih->biSize + pbih->biClrUsed *
                 sizeof(RGBQUAD) + pbih->biSizeImage);
    hdr.bfReserved1 = 0;
    hdr.bfReserved2 = 0;
 
    // Compute the offset to the array of color indices.
    hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
                    pbih->biSize + pbih->biClrUsed *
                    sizeof (RGBQUAD);
 
    // Copy the BITMAPFILEHEADER into the .BMP file.
    if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER), (LPDWORD) &dwTmp, NULL)) return 0;
 
    // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
    if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
                + pbih->biClrUsed * sizeof (RGBQUAD),
                (LPDWORD) &dwTmp, NULL))
        return 0;
 
    // Copy the array of color indices into the .BMP file.
    dwTotal = cb = pbih->biSizeImage;
    hp = lpBits;
    if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp, NULL)) return 0;
 
    // Close the .BMP file.
    if (!CloseHandle(hf)) return 0;
 
    // Free memory.
    GlobalFree((HGLOBAL)lpBits);
    ReleaseDC(0, hdcScr);
    ReleaseDC(0, hdcMem);
 
    return 1;
}
Ужжжжжжжжжжасная функция, но работает.
1
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.04.2011, 14:24
Цитата Сообщение от BadBaddak Посмотреть сообщение
Я то думал сохранить скрин, чтобы его потом анализировать на предмет цвета разных пикселей
А чем GetPixel() не устраивает?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 14:26
Цитата Сообщение от Kastaneda Посмотреть сообщение
чем GetPixel() не устраивает?
Отсутствием производительности?
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.04.2011, 14:31
Цитата Сообщение от BadBaddak Посмотреть сообщение
или можно как то по хендлу окна скринить его (при любом другом активном)?
Есть функци PrintWindow(), но она ужасно медленно работает, если нужно очень быстро реагировать на изменение цвета пикселей, то она не годиться.

Добавлено через 3 минуты
Цитата Сообщение от Deviaphan Посмотреть сообщение
Отсутствием производительности?
Тогда вот аналог, работает очень быстро (относительно конечно). Правда я там DeleteDC() и DeleteObject() в конце забыл добавить.
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 14:36
Цитата Сообщение от Kastaneda Посмотреть сообщение
анало
Про копирование в битмап уже написано на предыдущих страницах.
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
09.04.2011, 14:41
Цитата Сообщение от Deviaphan Посмотреть сообщение
Про копирование в битмап уже написано на предыдущих страницах.
Да, я видел, просто у там по ссылке более полный пример.
0
90 / 17 / 4
Регистрация: 09.06.2010
Сообщений: 100
10.04.2011, 14:02  [ТС]
Давайте с начала.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h> // для работы с винайпи
 
void ScreenActiveWin ()
{
    HDC wnd=GetDC(NULL);// хендл раб стола
    printf("Desktop = %d \n",wnd);
}
 
int main()
{
    ScreenActiveWin ();
    return 0;
}
Такая конструкция пойдёт? Сначала пишу функцию по захвату, потом добавлю анализатор.

Добавлено через 12 часов 13 минут
Это правильно?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
HDC hdc=GetDC(NULL);// хендл раб стола
    
    // создаём совместимый контекст памяти
      HDC hMemDc = CreateCompatibleDC(hdc);
 
    // создаём совместимый битмап
    HBITMAP hBmpNew = CreateCompatibleBitmap(hdc, 100, 100);
 
    // выбираем битмап в контекст
    HGDIOBJ hBmpOld = SelectObject(hMemDc, hBmpNew);
 
    // копируем из контекста моника в контекст памяти
    BOOL bitb = BitBlt(hMemDc, 0, 0, 100, 100, hdc, 0, 0, SRCCOPY);
Обычно при ошибке показывало в какой она строке и выделялось. Сейчас в конце выдаёт такую: obj\Release\main.o:main.c|| undefined reference to `CreateCompatibleDC@4'| Что это значит?
0
90 / 17 / 4
Регистрация: 09.06.2010
Сообщений: 100
13.04.2011, 21:35  [ТС]
угу.. подключил в ide, в компиляторе библиотеку gdi32.lib и всё заработало.
0
90 / 17 / 4
Регистрация: 09.06.2010
Сообщений: 100
16.04.2011, 14:25  [ТС]
заработало - в смысле ошибок не выдаёт.
Как я понимаю - в контексте памяти лежит копия раб стола. Как теперь сохранить в файл?
http://vsokovikov.narod.ru/New... _image.htm тут есть два примера, но я в них путаюсь. А в примере функции вообще много входных переменных, как функцию вызывать, что там писать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.04.2011, 14:25

как программно сделать скриншот экрана
как програмно сделать скриншот экрана?

Как сделать скриншот области экрана?
Есть пример на Делфи http://delphiexpert.ru/sozdanie-skrinshotera-na-delphi.html, но в Lazarus отсуствует Transparentcolor свойство. ...

Как сделать скриншот части экрана
Подскажите пожалуйста как сделать скриншот КУСОЧКА экрана с помощью VB2010? ! Внимание мои знания программиста очень скудны, если можно...

Как сделать скриншот региона экрана
Как сделать скриншот регоина экрана??? Я пыталься сделать так: procedure ScreenShot(Bild: TBitMap); var c: TCanvas; ...

[Windows Phone] Как сделать скриншот экрана? lumia 620
Здравствуйте, подскажите как сделать скриншот экрана? телефон lumia 620 Нужно какую то прогу ставить, какую?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Video: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru