Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2015, 18:02   #1
ram555x
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 16
По умолчанию работа функции bitblt под winXP

Через функцию bitblt копирую область из заданного окна на битмап destimage
Код:
bitblt(destimage.canvas.Handle, 0, 0, sourcerect.Width, sourcerect.Height, sourcehandle, 0,0, srcCopy);
На новых системах работает как задумано, но на windows XP почему то если поверх окна sourcehandle находится другое окно, то копируется область вместе с этим окном, как это исправить? Или может какой другой функцией можно воспользоваться чтобы на windows xp она работала корректно, нужно чтобы фиксировалась область именно заданного окна, даже если поверх будет куча других окон.

Последний раз редактировалось ram555x; 12.08.2015 в 21:41.
ram555x вне форума Ответить с цитированием
Старый 12.08.2015, 19:06   #2
ram555x
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 16
По умолчанию

Кажись нашел альтернативу
Код:
function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; stdcall;

function PrintWindow; external user32 name 'PrintWindow';
PrintWindow(sourcehandle, destimage.Canvas.Handle, 0);
На XP поверх окно теперь не мешает, но незнай как еще работать будет при длительном использовании.
Если у кого есть еще какие варианты решения, пишите.
ram555x вне форума Ответить с цитированием
Старый 12.08.2015, 19:12   #3
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Цитата:
если поверх окна sourcehandle находится другое окно, то копируется область вместе с этим окном
Оно всю жизнь так и работало. Странно как раз что как-то иначе стало в "новых". Это кстати в каких же?
Все как раз с ног сбились как копировать перекрытое/свёрнутое/задвинутое окно. И 100% решения нету. PrintWindow как раз более-менее неплохой вариант выдаёт.
ResourceSpace вне форума Ответить с цитированием
Старый 12.08.2015, 19:24   #4
ram555x
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 16
По умолчанию

bitblt тестил на windows 7 которая на ноуте стоит, а так проверял работу этой функции через виртуальную машину virtualbox, там на windows 8.1, так же работает, а вот на windows XP не хочет. Мне вообще нужно было чтобы область скринилась и при сворачивании окна, но в итоге решил перехватывать событие свертывания окна и помещать его за пределами экрана.
ram555x вне форума Ответить с цитированием
Старый 12.08.2015, 19:45   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,755
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
Оно всю жизнь так и работало. Странно как раз что как-то иначе стало в "новых". Это кстати в каких же?
На Windows c WDDI поведение вполне могло поменяться, особенно с включенным Aero. Раз теперь окно -- поверхность DirectX, и работа с ним по-другому ведется. Поменялась реализация -- поменялось и поведение.
Vapaamies вне форума Ответить с цитированием
Старый 12.08.2015, 20:55   #6
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Я ж и не говорил что не могло поменяться. Просто сиё странно и неожиданно. В XP и раньше окно в принципе не рисуется в тех местах где оно закрыто.
Или если задвинуто - область тоже не рисуется. И из DC просто нельзя получить того чего там нету. Функция PrintWindow() рисует при помощи отправки окну сообщений WM_ERASEBKGND + WM_PRINT + WM_PRINTCLIENT вроде как-то вдобавок контролируя окном владеет чужой процесс или нет (хотя не помню где это слышал).
Думаю ничего другого дельного вы не найдёте.
ResourceSpace вне форума Ответить с цитированием
Старый 12.08.2015, 21:04   #7
ram555x
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 16
По умолчанию

А еще вопросик по поводу эффективности использования printwindow, если мне к примеру нужно всю область окна получить только один раз при запуске, а потом только скринить определенную часть этого окна примерно каждые 3-5сек., вот разумно будет использовать данную функцию так часто? Или есть возможность как то через printwindow еще задать область окна которую надо получить? А то получается, что ради получения области 45x45, скриним область окна грубо 1000х1000. Так то проверил никаких дефектов отрисовки не заметил, если что данная функция у меня в отдельном потоке работает, и скринится хэндл flash-игры поэтому еще ближе к нужной области не подберешься.

Последний раз редактировалось ram555x; 12.08.2015 в 21:30.
ram555x вне форума Ответить с цитированием
Старый 12.08.2015, 21:47   #8
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

уууу... Предрекаю - флеш догадается что его дурят.

Как мы видим PrintWindow() не принимает таких параметров. А BitBlt() и StretchBlt() могут.
Функции рисования в ОС постоянно работают, тыщи раз в секунду, им без разницы. Но советую до рисований API делать Canvas.Lock; и Canvas.Unlock; после.
ResourceSpace вне форума Ответить с цитированием
Старый 12.08.2015, 21:54   #9
ram555x
Пользователь
 
Регистрация: 08.02.2009
Сообщений: 16
По умолчанию

А в каком смысле флэш догадается что его дурят?) Я до printwindow с помощью BitBlt() и обходился, но вот нашлись пользователи на XP до сих сидящии, и приходится более универсальное решение находить.
ram555x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c# и bitblt LOST94 C# (си шарп) 2 25.06.2013 16:46
Управление LPT под winXP maestrog Общие вопросы Delphi 1 03.04.2009 01:26
Нужна прога под WinXP/Vista. Плачу Webmoney. Garza Фриланс 3 16.01.2008 09:50