![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Здравствуйте, уважаемые форумчане!
В моем приложении мне нужно получить доступ к окну другого приложения, а именно к изображению в определенной его части для последующей его обработке в своей программе. Как мне это сделать? |
|
#2
|
|||
|
|||
|
А, сам практически ответил на свой вопрос. Вот код, который копирует текущее изображение с активной в данный момент формы на холст родной формы:
Код:
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
|
||||
|
||||
|
Цитата:
|
|
#4
|
|||
|
|||
|
О BitBlt я не подумал. Но она все-таки копирует изображение с одного DC на другой, то есть мне надо будет создавать свой контекст в памяти. Чтобы потом обращаться с помощью GetPixel к нему? А мне хотелось бы сразу получить массив пикселей, чтобы читать нужные мне данные из него путем итераций и без вызова Win32 API. Так нельзя сделать?
|
|
#5
|
||||
|
||||
|
Код:
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
|
|||
|
|||
|
NumLock, это понятно. Но только мне не нужно изображение с чужого окна копировать на свое, мне нужно его обрабатывать программно для получения кое-какой информации
|
|
#7
|
||||
|
||||
|
пользуйся scanline
|
|
#8
|
||||
|
||||
|
Код:
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; |