информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Продолжение темы в другом топике. 25.01.09 08:48  Число просмотров: 1142
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>


Print Screen окна выходящего за пределы видимости монитора
<programming>
[Win32] Print Screen, PrintWindow и тормоза 12.01.09 07:38  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Пишу бота для оной из онлайновых флеш игр. Мне нужно периодически считывать содержимое окна. Я нашёл два решения:
1. При помощи PrintWindow
2. При помощи Print Screen (т.ж. как в примере из MSDN, который лежит вместе с функцией CreateDC).

В первом варианте почему-то наблюдаются жуткие тормоза в обновлении окна, снимок которого я делаю; во втором случае всё в порядке. Можно было бы крикнуть ура, но второй вариант меня не устраивает тем, что окно, которое я снимаю всегда должно быть поверх остальных окон.

Суть вопроса: как делать снимки окна (допустим ч/з каждые 20 мс) без тормозов и без обязательного присутствия поверх всех окон?
Ещё один простой вопрос: есть ли третий способ фотографирования окна? 14.01.09 15:20  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Угу (мысли без решения): 14.01.09 17:37  
Автор: Ustin <Ustin> Статус: Elderman
Отредактировано 14.01.09 17:38  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
GetWindowPos, сеттопмост, GetWindowRect, bitblt, SetWindowsPos, только это вызовет постоянные моргания, так что решением не является.
Другое дело - если окно убрать куда-нить за десктоп, но подозреваю, что bitblt ничего bltить из невидимой области не будет, тоже не решение...
Можно подумать в сторону выделения отдельного десктопа для подопытного окна
Я думал об этом. А если создать в XP дополнительного... 14.01.09 18:05  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 14.01.09 18:07  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
Я думал об этом. А если создать в XP дополнительного пользователя, запустить программу из под него, а самому работать под другим пользователем? Тогда можно что-нибудь сделать?

Плюс. в варианте с PrintWindow BiltBlt работает и с окном, которое лежит на заднем плане, но PrintWindow тормозит. Я не понял, что Вы предлагаете взамен?
Неа, предлагаю избавиться от PrintWindow :) Это просто "размышления на тему", честно говоря никогда не занимался проблемой 14.01.09 19:16  
Автор: Ustin <Ustin> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
И ещё размышления без решения. Мне кажется, что тормоза... 14.01.09 15:18  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
И ещё размышления без решения. Мне кажется, что тормоза происходят большей частью от того, что на оконную функцию окна, которое я фотографирую сыпется куча левых (в смысле моих) сообщений, которые препятствуют нормальному её функционированию.

В варианте с окном "DISPLAY" на оконную функцию фотографируемого окна дополнительная нагрузка не налагается, поэтому и нет тормозов.

Теперь волнующий меня вопрос: можно ли как-то фотографировать окно, расположенное на заднем плане без нагрузки на его оконную функцию?
Сужаю вопрос 14.01.09 10:33  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>
Чем отличается принцип действия Print Screen от API-функции PrintWindow? Почему Print Screen не тормозит, а PrintWindow тормозит? Какие "системные инструменты" использует Print Screen?
Printscreen емнип берет готовый битмап прямо из видеобуфера... 14.01.09 13:50  
Автор: wildwind Статус: Незарегистрированный пользователь
<"чистая" ссылка> <обсуждение закрыто>
> Чем отличается принцип действия Print Screen от API-функции
> PrintWindow? Почему Print Screen не тормозит, а PrintWindow
> тормозит? Какие "системные инструменты" использует Print
> Screen?

PrintScreen ЕМНИП берет готовый битмап прямо из видеобуфера. А PrintWindow создает битмап и вызывает оконную функцию, чтобы та полностью отрисовала окно в контекст этого битмапа. Если делать это раз в 20 мс, неудивительно, что будет тормозить. Плюс отрисовка на битмап сама по себе медленнее, т.к. нет аппаратного ускорения.
Спасибо. Многое прояснилось, если конечно эта информация... 14.01.09 15:06  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
Отредактировано 14.01.09 15:14  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
Спасибо. Многое прояснилось, если конечно эта информация достоверна Вы можете дать ссылку на официальную документацию?

Не обижайтесь, что не верю на слово, просто такое поолжение вещей разбивает мои мечты. Получается, что скоростного фотографирования окна, которое стоит на заднем плане добиться не получится, т.к. в видео памяти информации о нём нет? Или есть другой вариант?

Плюс на сомнения по поводу копирования из видеобуфера наталкивает пример из MSDN, в котором данные копируются из окна "DISPLAY", или это и есть видодрайвер? Плюс ко всему здесь используется то же копирование на Bitmap:
hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL); 
hdcCompatible = CreateCompatibleDC(hdcScreen); 
 
// Create a compatible bitmap for hdcScreen. 
 
hbmScreen = CreateCompatibleBitmap(hdcScreen, 
                     GetDeviceCaps(hdcScreen, HORZRES), 
                     GetDeviceCaps(hdcScreen, VERTRES)); 
 
if (hbmScreen == 0) 
    errhandler("hbmScreen", hwnd); 
 
// Select the bitmaps into the compatible DC. 
 
if (!SelectObject(hdcCompatible, hbmScreen)) 
    errhandler("Compatible Bitmap Selection", hwnd); 
 
        // Hide the application window. 
 
        ShowWindow(hwnd, SW_HIDE); 
 
         //Copy color data for the entire display into a 
         //bitmap that is selected into a compatible DC. 
 
        if (!BitBlt(hdcCompatible, 
               0,0, 
               bmp.bmWidth, bmp.bmHeight, 
               hdcScreen, 
               0,0, 
               SRCCOPY)) 
 
        errhandler("Screen to Compat Blt Failed", hwnd); 
 
        // Redraw the application window. 
 
        ShowWindow(hwnd, SW_SHOW); 

---
Продолжение темы в другом топике. 25.01.09 08:48  
Автор: Vedrus <Serokhvostov Anton> Статус: Member
<"чистая" ссылка> <обсуждение закрыто>


Print Screen окна выходящего за пределы видимости монитора
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach