Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 14

Скрин только одного окна

17.07.2018, 14:54. Показов 1757. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
#include <windows.h>
#include <stdio.h>
 
int w, h;
void *p;
 
void dump_bmp()
{
int i;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bmi;
FILE * fp;
 
   
memset( &bfh, 0, sizeof( BITMAPFILEHEADER ) );
memset( &bmi, 0, sizeof( BITMAPINFOHEADER ) );
 
bfh.bfType  = 0x4d42; // "BM"
bfh.bfSize  = sizeof( BITMAPFILEHEADER ) + w * h * 4;
bfh.bfOffBits= sizeof( BITMAPFILEHEADER ) + sizeof( BITMAPINFOHEADER );
 
bmi.biSize  = sizeof( BITMAPINFOHEADER );
bmi.biWidth = w;
bmi.biHeight= h;
bmi.biPlanes= 1;
bmi.biBitCount= 32;
bmi.biCompression= BI_RGB;
 
fp = fopen( "ss.jpeg", "wb+" );
 
fwrite( &bfh, sizeof( BITMAPFILEHEADER ), 1, fp );
fwrite( &bmi, sizeof( BITMAPINFOHEADER ), 1, fp );
fwrite( p, w * h * 4, 1, fp );
 
fclose( fp );
}
 
 
int main()
{
HDC hdc;
HBITMAP dib;
BITMAPINFOHEADER bi;
 
RECT rect;
HWND hwnd = GetDesktopWindow();
GetWindowRect(hwnd,&rect);
   
   printf("%d %d",rect.right - rect.left,rect.bottom - rect.top);
 
 
   
w = GetSystemMetrics( SM_CXSCREEN );
h = GetSystemMetrics( SM_CYSCREEN );
 
bi.biSize= sizeof( BITMAPINFOHEADER );
bi.biWidth= w;
bi.biHeight= h;
bi.biPlanes= 1;
bi.biBitCount= 32;
bi.biCompression    = BI_RGB;
hdc = CreateCompatibleDC( NULL );//
dib = CreateDIBSection( hdc, (BITMAPINFO *)&bi, DIB_RGB_COLORS, (void **)&p, NULL, 0 );
SelectObject( hdc, dib );
 
BitBlt( hdc, 0, 0, w, h, GetDC( NULL ), 0, 0, SRCCOPY );
 
dump_bmp();
 
return 0;
}
не пойму как сделать так , чтобы создавался скрин только одного окна(например консоли), а не всего экрана
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.07.2018, 14:54
Ответы с готовыми решениями:

Скрин диалогового окна
Доброго времени суток всем! Помогите,если кто понимает... надо реализовать в программе создание скрина диалогового окна... по порядку...

Сделать скрин выбранного окна
Здравствуйте господа. Требуется вот что: сделать скриншот выбранного окна. т.е. получить список процессов, выбрать из списка...

Как сделать скрин активного окна?
Как сделать скрин активного окна? скок искал находил только на общий скрин С Vb общаюсь недавно, сам сообразить пока не могу

8
29 / 15 / 10
Регистрация: 07.06.2018
Сообщений: 110
17.07.2018, 16:02
Нужно задавать в параметрах функции BitBlt координаты верхнего верхнего угла, где окно на данный момент находится, и размеры этого окна. Соответственно Bitmap создается размерами равными этому окну
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 14
17.07.2018, 16:20  [ТС]
так самый рофел в том, что я не знаю как определить координаты окна, у меня получилось взять хендл , но он принадлежил рабочему столу.
0
29 / 15 / 10
Регистрация: 07.06.2018
Сообщений: 110
17.07.2018, 16:35
Цитата Сообщение от sasha7971182 Посмотреть сообщение
так самый рофел в том, что я не знаю как определить координаты окна, у меня получилось взять хендл , но он принадлежил рабочему столу.
Не зная конкретно какая задача стоит перед вами, мне сложно что-то конкретное порекомендовать. Но я вам посоветую присмотреться к функциям FindWindow и EnumWindows. Для более детального ответа нужна дополнительная информация.
0
0 / 0 / 0
Регистрация: 29.03.2018
Сообщений: 14
17.07.2018, 16:47  [ТС]
нужно снимать скриншон моего графического окна
Миниатюры
Скрин только одного окна  
0
29 / 15 / 10
Регистрация: 07.06.2018
Сообщений: 110
17.07.2018, 16:55
Лучший ответ Сообщение было отмечено sasha7971182 как решение

Решение

Если тебе надо сделать скриншот окна, которое делает твоя программа, то ты знаешь имя его класса и заголовка окна. Тогда с помощью функции FindWindow пытаешься найти его хендл.
1
 Аватар для Геомеханик
838 / 641 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
17.07.2018, 18:14
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include <windows.h>
#include <string.h>
#include <stdio.h>
 
typedef struct {
    HDC     hdc;
    HBITMAP hbm;
    int     width;
    int     height;
} bmp_t;
 
BOOL bmp_create(bmp_t* b, HDC hDC, int w, int h);
void bmp_init(bmp_t* b);
void bmp_free(bmp_t* b);
DWORD FormToFile(LPCTSTR filename, BOOL re_write, HWND hwnd);
 
int main(void){
    DWORD ret;
    TCHAR fn[] = TEXT("console.bmp");
 
    puts("\t\t\t\t*** C/C++ ***");
    puts("\t\t\t\t*** PASCAL ***");
    puts("\t\t\t\t*** JAVA ***");
 
    ret = FormToFile(fn, TRUE, GetConsoleWindow());
    if(ret != NO_ERROR)
        printf("error, code: %lu\n", ret);
    getchar();
    return 0;
}
 
DWORD FormToFile(LPCTSTR filename, BOOL re_write, HWND hwnd){
    int    cy, row;
    HDC    hdc;
    RECT   rc;
    bmp_t  src, dst;
    BOOL   res;
    DWORD  size, n;
    BITMAP inf;
    BITMAPFILEHEADER  fh;
    BITMAPINFOHEADER* pb;
    BITMAPINFO bi;
    HANDLE fp  = INVALID_HANDLE_VALUE;
    PBYTE  buf = NULL;
    DWORD  ret = NO_ERROR;
 
    if(!GetWindowRect(hwnd, &rc))
        return GetLastError();
 
    bmp_init(&src);
    bmp_init(&dst);
 
    hdc = GetDC(NULL);
    if(!bmp_create(&src, hdc, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN))){
        ret = GetLastError();
        goto err;
    }
 
    if(!bmp_create(&dst, hdc, rc.right - rc.left, rc.bottom - rc.top)){
        ret = GetLastError();
        goto err;
    }
 
    if(!BitBlt(src.hdc, 0, 0, src.width, src.height, hdc, 0, 0, SRCCOPY)){
        ret = GetLastError();
        goto err;
    }
 
    if(!BitBlt(dst.hdc, 0, 0, dst.width, dst.height, src.hdc, rc.left, rc.top, SRCCOPY)){
        ret = GetLastError();
        goto err;
    }
 
    if(!GetObject(dst.hbm, sizeof(inf), (LPVOID)&inf)){
        ret = GetLastError();
        goto err;
    }
 
    if(inf.bmBitsPixel < 24){
        ret = ERROR_BAD_FORMAT;
        goto err;
    }
 
    cy   = (inf.bmHeight < 0) ? -inf.bmHeight : inf.bmHeight;
    row  = (inf.bmWidth * inf.bmBitsPixel + 31) / 32 * 4;
    size = row * cy;
    buf  = (PBYTE)HeapAlloc(GetProcessHeap(), 0, size);
    if(buf == NULL){
        ret = ERROR_OUTOFMEMORY;
        goto err;
    }
 
    memset(&bi, 0, sizeof(bi));
    pb = &bi.bmiHeader;
    pb->biSize          = sizeof(bi.bmiHeader);
    pb->biWidth         = inf.bmWidth;
    pb->biHeight        = inf.bmHeight;
    pb->biBitCount      = inf.bmBitsPixel;
    pb->biPlanes        = inf.bmPlanes;
    pb->biSizeImage     = size;
    pb->biCompression   = BI_RGB;
    pb->biXPelsPerMeter = 11811L;
    pb->biYPelsPerMeter = 11811L;
 
    if(!GetDIBits(dst.hdc, dst.hbm, 0, (UINT)inf.bmHeight, (LPVOID)buf, &bi, DIB_RGB_COLORS)){
        ret = GetLastError();
        goto err;
    }
 
    memset(&fh, 0, sizeof(fh));
    fh.bfType    = 0x4D42;
    fh.bfSize    = size + sizeof(bi.bmiHeader);
    fh.bfOffBits = sizeof(fh) + sizeof(bi.bmiHeader);
 
    fp = CreateFile(filename, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, 
                   (re_write) ? CREATE_ALWAYS : CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    if(fp == INVALID_HANDLE_VALUE){
        ret = GetLastError();
        goto err;
    }
 
    res = WriteFile(fp, (LPCVOID)&fh, sizeof(fh), &n, NULL);
    if(!res || (n != sizeof(fh))){
        ret = GetLastError();
        goto err;
    }
 
    res = WriteFile(fp, (LPCVOID)&bi.bmiHeader, sizeof(bi.bmiHeader), &n, NULL);
    if(!res || (n != sizeof(bi.bmiHeader))){
        ret = GetLastError();
        goto err;
    }   
 
    res = WriteFile(fp, (LPCVOID)buf, size, &n, NULL);
    if(!res || (n != size))
        ret = GetLastError();
    else
        FlushFileBuffers(fp);
 
    CloseHandle(fp);
    fp = INVALID_HANDLE_VALUE;
err:
    ReleaseDC(NULL, hdc);
    bmp_free(&src);
    bmp_free(&dst);
 
    if(buf != NULL)
        HeapFree(GetProcessHeap(), 0, buf);
    if(fp != INVALID_HANDLE_VALUE){
        CloseHandle(fp);
        DeleteFile(filename);
    }
    return ret;
}
 
//создание
BOOL bmp_create(bmp_t* b, HDC hDC, int w, int h){
    if((b->hdc = CreateCompatibleDC(hDC)) == NULL)
        return FALSE;
    if((b->hbm = CreateCompatibleBitmap(hDC, w, h)) == NULL){
        bmp_free(b);
        return FALSE;
    }
    SelectObject(b->hdc, b->hbm);
    b->width  = w;
    b->height = h;
    return TRUE;
}
 
//удаление
void bmp_free(bmp_t* b){
    if(b->hbm != NULL){
        DeleteObject(b->hbm);
        b->hbm = NULL;
    }
 
    if(b->hdc != NULL){
        DeleteDC(b->hdc);
        b->hdc = NULL;
    }
}
 
void bmp_init(bmp_t* b){
    b->hdc = NULL;
    b->hbm = NULL;
}
0
35 / 17 / 10
Регистрация: 13.12.2014
Сообщений: 107
17.07.2018, 20:23
Цитата Сообщение от Melamed Посмотреть сообщение
Если тебе надо сделать скриншот окна, которое делает твоя программа, то ты знаешь имя его класса и заголовка окна. Тогда с помощью функции FindWindow пытаешься найти его хендл.
Я даже скажу больше: если твоя программа создает окно, то она как правило знает хендл (он возвращается как результат функции создания окна).
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
11.08.2018, 17:32
MSDN: PrintWindow function
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.08.2018, 17:32
Помогаю со студенческими работами здесь

Скрин чужого окна по его дексриптору
Здравствуйте! как можно сделать скрин чужого окна, если известен его дескриптор //... HWND h1; h1 =(HWND)...

Скрин чужого окна по его HANDLE
Прошу помощи\совета что то я никак не могу получить скрин окна по HANDLE ниже приведен код, он делает скрин и выводит в Image1 но...

Как получить скрин именно окна другой программы, а не всего, того что находится на мониторе
Как получить скрин именно окна другой программы а не всего того что находиться на мониторе. Перерыл весь инет, бесполезно. Пожалуйста....

Закрытие одного окна по таймеру с последующем открытием другого окна
Приветствую! Необходимо создать приветственное окно для программы. Сначала должно открываться приветственное окно, висеть примерно 7...

Передача информации из текстбоксов одного окна в таблицу другого окна
Доброго времени суток, пишу программу для mac os x, нужна подсказка, как сделать (не прошу делать, а прошу подсказать), чтобы при нажатии...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru