3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420

Как из активного окна Form1 сканировать скрытое окно Form2

25.12.2025, 19:53. Показов 589. Ответов 6

Студворк — интернет-сервис помощи студентам
Есть активное окно Form1, на нём кнопка Button1, запускающая сканирование скрытого окна Form2.
На Form2 есть компонент Image1 с картинкой.

Код сканирования:
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
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  HWND hWnd = FindWindow("Form", "Form2");                       // Поиск дескриптора для Form2
  HDC hdcScreen = GetDC(hWnd);                                   // NULL для всего экрана
  HDC hdcMem = CreateCompatibleDC(hdcScreen);                    // Создаем память
  HBITMAP hBitmap = CreateCompatibleBitmap(hdcScreen, 200, 200); // Создаем битмап
  HBITMAP xxx = (HBITMAP)SelectObject(hdcMem, hBitmap);          // Выбираем битмап в память
 
  //Копируем из окна в память
  BitBlt(hdcMem, 0, 0, 200, 200, hdcScreen, 0, 0, SRCCOPY);
 
  //Размеры клиентской области окна
  int clWidth  = Form2->ClientWidth;
  int clHeight = Form2->ClientHeight;
  //Создаем битмап (для будущей записи в файл, т.к. среда программирования C++ Builder 6)
  Graphics::TBitmap *bitmap = new Graphics::TBitmap;
  bitmap->Width  = clWidth;
  bitmap->Height = clHeight;
  //Формат бита растрового изображения
  bitmap->PixelFormat=pf24bit;
  //Копируем из памяти в bitmap
  BitBlt(bitmap->Canvas->Handle, 0, 0, 200, 200, hdcMem, 0, 0, SRCCOPY);
 
  //Сохраняем bitmap в файл
  char adr[MAX_PATH]={"C:/.../1.bmp"};
  bitmap->SaveToFile(adr);
 
  //Освобождаем ресурсы
  DeleteObject(hBitmap);
  DeleteDC(hdcMem);
  ReleaseDC(hWnd, hdcScreen);
  delete bitmap;
}
Проблема в том, не сканирует, но не Form2, а Form1 или экран монитора.
Если изменять параметры FindWindow(arg1, arg2):
Code
1
2
3
4
5
arg1     arg2     результат
NULL,   "Form1" - Form1 программы
NULL,   "Form1" - чёрное пятно
"Form", "Form1" - часть окна монитора с иконками
"Form", "Form2" - часть окна монитора с иконками
Где у меня ошибки?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.12.2025, 19:53
Ответы с готовыми решениями:

Как написать функцию для Буттон1(Которая распол. на Form2) что бы возвращалась к Form1 от Form2
Коллеги подскажите как написать такю кнопку=)) Пробовал oid __fastcall TForm2::Button1Click(TObject...

Как сделать чтобы окна Form1 и Form1(Design) открывались автоматически?
Как сделать чтобы окна Form1 и Form1(Design) открывались автоматически? В Visual Studio 2010.

Как в form2 значение top установить, как в form1?
как в form2 значение top установить как в form1?

6
2642 / 1653 / 267
Регистрация: 19.02.2010
Сообщений: 4,375
25.12.2025, 21:27
Зачем такие сложности?
Достать картинку можно одной строкой кода - с помощью метода, стандартно имеющегося у класса формы:
C++
1
Graphics::TBitmap* bitmap=Form2->GetFormImage();
Т.е. строки 3-22 в своём коде заменяй на указанную - и проверяй, сработает ли со скрытой формой (в хэлпе про это не сказано).
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33378 / 21502 / 8236
Регистрация: 22.10.2011
Сообщений: 36,899
Записей в блоге: 11
26.12.2025, 12:12
проверяй, сработает ли со скрытой формой
не сработает. Для GetFormImage форма должна быть видимой.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
27.12.2025, 09:51  [ТС]
VTsaregorodtsev, volvo, Сработало, но не полностью, да и у GetFormImage() есть огромный недостаток - копирует пиксели как четырёх-байтовые, а мне нужны трёх-байтовые:
C++
1
2
3
4
5
6
7
8
9
10
Graphics::TBitmap *bitmap = new Graphics::TBitmap;
//Формат бита растрового изображения
bitmap->PixelFormat=pf24bit; //пиксель трёх-байтовый
//Сканирование Form2 в bitmap
bitmap=Form2->GetFormImage();
//Сохраняем bitmap в файл
char adr[MAX_PATH]={"C:/.../1.bmp"};
bitmap->SaveToFile(adr);
// Освобождаем ресурсы
delete bitmap;
Сработало не полностью:
1. Изображение из Image1 скопировал.
2. Информацию с CppWebBrowser1 вообще игнорировал, а только отобразил прямоугольник белого цвета.

П.С. Буду искать другие варианты или с GetFormImage(), но открытым Form2.
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
15.01.2026, 18:35  [ТС]
Условие изменилось. Уже сканировать не скрытое окно Form2, а активированное окно Form2, но из того же окна Form1

Окно Form1: В нём кнопка Button1.
Окно Form2: В нём кнопка Button2 и браузер CppWebBrowser2.
C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Form2->ShowModal(); // Открываем окно Form2 в модальном режиме
}
ОБРАБОТЧИКИ СОБЫТИЙ Form2
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
void __fastcall TForm2::FormCreate(TObject *Sender)
{
  CppWebBrowser2->Navigate(WideString("about:blank"));
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormShow(TObject *Sender)
{ //Код для CppWebBrowser2
  AnsiString w="<html><head><style>body{margin:0; padding:0; border:none; text-align:center; background-color:#ddd; overflow:hidden;}";
  w+="</style></head><body><table style='border-collapse:collapse;'>";
  w+="<tr><td style='text-align:left; width:150px; height:150px; padding:0; vertical-align:top; font-size:0;'>";
  w+="<img width=150 height=150 style='vertical-align:middle;' src='C:/.../1.jpg'></td>";
  w+="<td style='font:18px Arial; width:150px;'>Это ёжик</td></tr></table></body></html>";
 
  //Загрузка 'w' В CppWebBrouser1
  TMemoryStream *stm = new TMemoryStream;
  TStringList *st = new TStringList;
  st->Text=w;
  st->SaveToStream(stm);
  stm->Seek(0, soFromBeginning);
  TStreamAdapter *sa = new TStreamAdapter(stm, soReference);
  IPersistStreamInit *psi;
  CppWebBrowser2->Document->QueryInterface(IID_IPersistStreamInit,(void **)&psi);
  if(psi)
  { psi->Load(*sa);
    psi->Release();
  }
  delete stm; delete st;
}
//---------------------------------------------------------------------------
_di_IDispatch CurDispatch = NULL;
 
void __fastcall TForm2::CppWebBrowser2DocumentComplete(TObject *Sender, LPDISPATCH pDisp, Variant *URL)
{ if(CurDispatch && pDisp==CurDispatch) //если CppWebBrowser2 загружен
  { Button2->Click();                   //программно нажимаем Button2
    CurDispatch = NULL;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm2::CppWebBrowser2NavigateComplete2(TObject *Sender, LPDISPATCH pDisp, Variant *URL)
{
  if(!CurDispatch && Sender==CppWebBrowser2)
    CurDispatch = pDisp;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{ //Контекст устройства окна Form2
  HDC hdcWin = GetWindowDC(this->Handle);
 
  //Размеры окна Form2
  int winWidth  = this->Width;            //ширина
  int winHeight = this->Height;           //высота
 
  //Размеры клиентской области окна Form2
  int clWidth  = this->ClientWidth;       //ширина
  int clHeight = this->ClientHeight;      //высота
 
  //Привязка клиентской области
  int left = (winWidth - clWidth)/2;      //левая привязка
  int top  = winHeight - clHeight - left; //верхняя привязка
 
  //Создаем битмап окна Form2 (клиентская область)
  Graphics::TBitmap *bitmap = new Graphics::TBitmap;
  bitmap->Width  = clWidth;
  bitmap->Height = clHeight;
  //Формат бита растрового изображения
  bitmap->PixelFormat=pf24bit;            //пиксель трёхбайтовый
 
  //Копируем из окна Form2 в битмап
  BitBlt(bitmap->Canvas->Handle, 0, 0, clWidth, clHeight, hdcWin, left, top, SRCCOPY);
 
  //Запись в файл
  bitmap->SaveToFile("1.bmp");
 
  //Освобождаем ресурсы
  ReleaseDC(this->Handle, hdcWin);
  delete bitmap;
}
1. При запуске программы и нажатии Button1 в Form1 загружается окно Form2,
а в файл 1.bmp записывается изображение с контурами CppWebBrowser2 и Button2 (см. 2.jpg сообщение ниже)


2. При запуске программы и нажатии Button1 в Form1 загружается окно Form2, и при нажатии Button2 (на Form2)
в в файл 1.bmp записывается изображение с загруженным CppWebBrowser2 и прорисованной кнопкой Button2 (см. 3.jpg сообщение ниже)

Вопрос: где кроется ошибка и почему нельзя программно Button2->Click(); загрузить заполненный CppWebBrowser2 ?
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
15.01.2026, 18:42  [ТС]
2.jpg


3.jpg
0
3 / 3 / 0
Регистрация: 10.06.2016
Сообщений: 420
20.01.2026, 09:08  [ТС]
Ответ нашёл методом тыка!
Нужно добавить Application->ProcessMessages
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.01.2026, 09:08
Помогаю со студенческими работами здесь

Как изменить Form1 на Form2
Как изменить Form1 на Form2. мне нада связать две формы, броблема втом что обе Form1. Ты открываеш...

Как вывести Form2 из Form1
Создаю новую форму, в баттон на форм1 пишу &quot;Form2-&gt;Show();&quot;, компилятор выдает ошибки:может еще...

Как осуществить переход с form1 на form2 при нажатии кнопки
Как осуществить переход с form1 на form2 при нажатии кнопки?

Как открыть Form2 через Form1
Ребят вообщем столкнулся с ситуацией. У меня есть на форме построение кривой, и мне нужно вывести...

Как обратится к компоненту Form1 из Form2?
Я вставил у Unit1.cpp хедер #include &quot;Unit2.h&quot; , но когда со второй формы по нажатию кнопки...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

Новые блоги и статьи
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 31.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