Добрый день, есть нетривиальная задача.
Есть программа, написана давным-давно на Delphi. На одной из форм расположен TPaintBox – не подскажете, какими средствами можно вытащить содержимое объекта (получить картинку)?
Скриншот экрана не получится, TPaintBox не помещается на экран.
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
04-10-2019 03:00
>>> но есть некий Bitmap, наверняка TBitmap
Нет никакого битмапа для TPaintBox. Посмотрите хотя бы пример OnPaint для PaintBox от Борланда (и пофиг, что он давно не борланд), а потом подумайте, откуда для того самого Ellipse возьмётся TBitmap?
Если в целевой программе используется TImage, который как раз имеет TBitmap, то в принципе в этом направлении можно попробовать покопать, но помним, что
>>> Малейшее изменение направления ветра, и все перестанет работать
>>>Можно ли прочитать его, например, через ReadProcessMemory? Вот только бы смещение к этому Bitmap узнать
От таких хаков точно лучше отказаться. Малейшее изменение направления ветра, и все перестанет работать
03-10-2019 10:47 | Комментарий к предыдущим ответам
Тоже задумался над этим вопросом. В PaintBox, конечно, никаких данных нет, но есть некий Bitmap, наверняка TBitmap. Можно ли прочитать его, например, через ReadProcessMemory? Вот только бы смещение к этому Bitmap узнать.
>>>Работало (иработает) всё на XP точно, может быть и раньше
Возможно, они пользуются именно рисованием в заданный контекст через WM_PAINT. Да и программы типа Remote Administrator чем-то пользуются...
Но я имел в виду текстура-буфер окна, который появился в Висте (если не ошибаюсь), где рисование идет через DirectX
>>> в системах не ниже Висты
Почему не ниже висты? Многие программы снятия скриншотов (из платных SnagIt из бесплатных PicPick) умеют снимать скрин окна, а не экрана. Работает даже если окно частично вылезло за границы экрана (полностью - не пробовал, не было нужды). Работало (иработает) всё на XP точно, может быть и раньше.
Еще есть вариант: послать нужному окну WM_Paint, указав в качестве параметра (см. справку) нужный контекст устройства. Возможно, окно правильно нарисует себя куда указано
В общем случае, никакими, TPaintBox - просто дырка для рисования, процесс рисования односторонний. Разве что чудить в системах не ниже Висты, где изображение окна буферизуется - попробовать получить контекст окна-владельца TPaintBox (GetDC, GetWindowDC) и что-то с него скопировать, но успех маловероятен. И окно-владелец нужно сначала найти. Или искать какой-то извращенный способ добраться до буфера.
Кроме того, то, что содержимое не помещается на экран, скорее всего означает, что оно и рисуется фрагментарно - только видимая часть
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.