Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.04.2011, 22:41
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию Доступ к изображению окна другого приложения

Здравствуйте, уважаемые форумчане!

В моем приложении мне нужно получить доступ к окну другого приложения, а именно к изображению в определенной его части для последующей его обработке в своей программе. Как мне это сделать?
Ответить с цитированием
  #2  
Старый 05.04.2011, 00:36
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

А, сам практически ответил на свой вопрос. Вот код, который копирует текущее изображение с активной в данный момент формы на холст родной формы:

Код:
Window := GetForegroundWindow();
  DC := GetDC(Window);
  for i := 0 to 100 do
    for j := 0 to 100 do
    begin
      Canvas.Pixels[i, j] := GetPixel(DC, i, j);
    end;
  ReleaseDC(Window, DC);

То есть, мы получаем hDC чужой формы и вольны делать с ним что угодно, читать пиксели с него и даже рисовать на нем. Но вот мое замечание: данный код работает очень медленно. Для кусочка 100*100 функция GetPixel вызывается 10 000 раз! Нет ли какого-нибудь способа считать с DC чужой формы целый ректангл за один вызов функции Win32 API?
Ответить с цитированием
  #3  
Старый 05.04.2011, 00:49
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

Цитата:
Сообщение от Homez
А, сам практически ответил на свой вопрос. Вот код, который копирует текущее изображение с активной в данный момент формы на холст родной формы:

Код:
Window := GetForegroundWindow();
  DC := GetDC(Window);
  for i := 0 to 100 do
    for j := 0 to 100 do
    begin
      Canvas.Pixels[i, j] := GetPixel(DC, i, j);
    end;
  ReleaseDC(Window, DC);

То есть, мы получаем hDC чужой формы и вольны делать с ним что угодно, читать пиксели с него и даже рисовать на нем. Но вот мое замечание: данный код работает очень медленно. Для кусочка 100*100 функция GetPixel вызывается 10 000 раз! Нет ли какого-нибудь способа считать с DC чужой формы целый ректангл за один вызов функции Win32 API?
а это не катит BitBlt
Ответить с цитированием
  #4  
Старый 05.04.2011, 11:12
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

О BitBlt я не подумал. Но она все-таки копирует изображение с одного DC на другой, то есть мне надо будет создавать свой контекст в памяти. Чтобы потом обращаться с помощью GetPixel к нему? А мне хотелось бы сразу получить массив пикселей, чтобы читать нужные мне данные из него путем итераций и без вызова Win32 API. Так нельзя сделать?
Ответить с цитированием
  #5  
Старый 05.04.2011, 11:23
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  hWnd: THandle;
  dc: HDC;
begin
  hWnd:=GetForegroundWindow;
  dc:=GetDC(hWnd);
  try
    BitBlt(Canvas.Handle, 0, 0, 100, 100, dc, 0, 0, SRCCOPY);
  finally
    ReleaseDC(hWnd, dc);
  end;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 05.04.2011, 11:27
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

NumLock, это понятно. Но только мне не нужно изображение с чужого окна копировать на свое, мне нужно его обрабатывать программно для получения кое-какой информации
Ответить с цитированием
  #7  
Старый 05.04.2011, 11:36
Аватар для Pilot_Red
Pilot_Red Pilot_Red вне форума
Продвинутый
 
Регистрация: 01.11.2006
Адрес: Карелия
Сообщения: 702
Версия Delphi: D7
Репутация: 11581
По умолчанию

пользуйся scanline
Ответить с цитированием
  #8  
Старый 05.04.2011, 14:09
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
var
  bmp: TBitmap;
  hWnd: THandle;
  dc: HDC;
begin
  hWnd:=GetForegroundWindow;
  dc:=GetDC(hWnd);
  bmp:=TBitmap.Create;
  bmp.Width:=100;
  bmp.Height:=100;
  try
    BitBlt(bmp.Canvas.Handle, 0, 0, 100, 100, dc, 0, 0, SRCCOPY);
    // work with bmp:
    Canvas.Draw(0, 0, bmp); // пример work
    bmp.ScanLine[0]; // пример 2 work
  finally
    bmp.Free;
    ReleaseDC(hWnd, dc);
  end;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter