Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как скопировать окно?  (Прочитано 9540 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
onic777
Интересующийся

md
Offline Offline
Пол: Мужской

« : 18-11-2016 18:33 » 

Добрый день, Знатоки!

Имеется некоторое окно для которого известен HWND hWndSrc. На окне что-то рисуется...
Как создать точную копию окна и повторять в нем все, что рисуется в первом окне?

С Уважением,
Onic777
Записан
zubr
Гость
« Ответ #1 : 18-11-2016 21:55 » 

1. Получить контекст окна source: GetDc(hWndSrc)
2. Получить контекст окна dest: GetDC(hWndDest)
3. Скопировать контекст окна source в контекст окна dest: BitBlt
Записан
onic777
Интересующийся

md
Offline Offline
Пол: Мужской

« Ответ #2 : 19-11-2016 06:57 » 

Спасибо!
Но это прокатит если окно-копия уже существует!
А в вопросе было "Как создать точную копию окна"!

1. Сздает ли окно-копию CreateCompatibleDC(hdcSrc); ?
Если да как его сделать видимым?

2. Если есть Bitmap с заданными размерами, как для него создать окно-копию и сделать его (окно) видимым?

3. Как вообще с помощью WinAPI создать видимое окно с заданными размерами (известен только hWndSrc окна-источника)

Спасибо за ответы начинающему!
Если можно по подробнее!

Onic777
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 19-11-2016 08:28 » new

onic777, в общем случае - примерную копию можно попробовать сделать, понадобятся функции, подобные перечисленным здесь (это для MFC, но они очень похожи, можно найти аналоги для винапи)
 https://msdn.microsoft.com/en-us/library/1xb05f0h.aspx

забираешь класс окна, его стили и размеры, создаёшь такое же. Потом шуршишь по чайлдам и воссоздаёшь такое же дерево потомков. Но это будет только каркас, без функционала, который в окне-источнике, возможно, изменён.

Удачи и терпения Отлично

Записан

zubr
Гость
« Ответ #4 : 20-11-2016 07:50 » 

Алексей++,  ну там у топик стартера ключевая фраза - "что то рисуется в окне", то есть речь, как я понял, о динамике, а не только воссоздание статических элементов окон.
Простой вариант - конечно не реальная рабочая копия - в цикле периодически сохранять искомое окно в битмап (алгоритм сохранения в битмап описан в моем посте выше).
Ну а сложный вариант (как я предполагаю - речь о окне чужого процесса):
1. Копирование структуры статических элементов окна, то есть дочерних окон, как описал выше Алексей++.
2. Инжект в процесс копируемого окна, перехват функций создания окон (CreateWindow, CreateWindowEx), если в процессе работы копируемого окна создаются новые дочерние окна, перехват GDI-функций, если в окне что то рисуется или пишется. Возможно еще и сабклассинг функций копируемого окна и его дочерних окон, для эмуляции событий копируемого окна в своем окне.
По 2-му варианту цена вопроса достаточно высока, одних только функций GDI больше сотни наберется  и каждую надо прописать в коде. Я уж не говорю про отладку, которая в чужом процессе проводится посредством отладочных сообщений, пишущихся в лог.

Лет 6 назад я для одной конторы писал PrintSniffer _http://searchinform.ru/products/kib/how-it-works/printsniffer/, вот там как раз и пришлось перехватывать GDI-функции, ушло на это 3 месяца (это только на модуль перехвата).
Записан
onic777
Интересующийся

md
Offline Offline
Пол: Мужской

« Ответ #5 : 26-11-2016 11:48 » 

Всем спасибо за ответы!

Проблема разрешилась!

Onic777
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines