|
|
Регистрация | << Правила форума >> | 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; Пишу программы за еду. __________________ |