Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Получение скрина окна и HDC.


Автор: IWTK 29.4.2010, 18:01
Привет всем. Мне нужно сделать скриншот чужого окна. Получить его DC, и потом коечто нарисовать на этом окне.
Получаю скрин при помощи PrintWindow.
Но если писать так PrintWindow(HWND, DC, 0); то не работает. DC я не могу получить.
А если вот так PrintWindow(HWND, image1.canvas.handle, 0); то работает хорошо.
решил воспользоваться для рисования на чужом окне функцией StretchBLt, но еще толком сней не разобрался.

Если можно так. помогите мне получить dc окна. и потом на нем нарисовать картинку. Текс без проблем рисуеться а вот как картинку нарисовать я почти не понял.
GETDC и GETWINDOWDC получает, но если окно перекрыто другим чем нибудь, то это плохо. Вот принтвиндов получает даже если оно и перекрыто.

Автор: IWTK 29.4.2010, 18:31
Ребята что то я затупил по полной, а мб и нет.
Ведь если окна не видно зачем рисовать тогда? Правильно не надо. 
Так что с DC я справился сам.

Прошу Вас помочь в оставшемся вопросе. Как нарисовать картинку допустим из image1 на чудом окне?

Автор: Proxin 29.4.2010, 19:02
bitblt и stretchblt. ищи в msdn описание этих функций.

Автор: IWTK 29.4.2010, 19:16
а разве при помощи bitblt что нибудь на другом окне можно нарисовать? а есть еще какие нибудь функции?

Автор: IWTK 29.4.2010, 19:45
И если не трудно то помогите еще с этой функцией.
 Так вот она объявлена
Код

Function PrintWindow(h:HWND; DC:HDC; nFlags:DWORD) : Bool; StdCall; External 'user32.dll';

implementation

{$R *.Dfm}

если писать так
var
dc:hdc;
bmp : tbitmap;
begin
printwindow(h, dc, 0);
.........................
создаем bmp....
.........................
bitblt(bmp.canvas.handle, 0,0 200,200 dc, 0,0 srccopy);
image1.picture.assign(bmp);


то по завершению image1 пустой.
почему через printwindow ничего не помещаеться  в dc???

Автор: Amphiluke 29.4.2010, 20:36
Какие-то совершенно излишние манипуляции, IMHO.

Почему бы не
Код

PrintWindow(h, Image1.Canvas.Handle, 0);


?

Автор: IWTK 30.4.2010, 13:06
Цитата(Amphiluke @ 29.4.2010,  20:36)
Какие-то совершенно излишние манипуляции, IMHO.

Почему бы не
Код

PrintWindow(h, Image1.Canvas.Handle, 0);


?

Так мы просто получим скрин окна, которого нам надо.

Может кто нибудь объяснить почему не работает если подставить делать вот так
Код

var
DC : HDC;
H := HWND;
Begin
PrintWindow(H, DC, 0);

DC в чебя ничего не берет. а может и берет да я не могу достать. подскажите.

МБ я туплю сейчас, ведь printwindow предназначена для снятия скриншотов, а не получения DC. Наверное поэтому и не работатет.

Спасибо всем кто хоть чем то помог. Почти Во всем разобрался.

Может ли кто-нибудь выложить описание флагов для printwindow и bitblt? на русском. srccopy, srcpaint и т.д.

Автор: Maks1509 2.5.2010, 17:13
IWTK
А ты точно уверен что HWND окна тот, который тебе требуется? Где код получения DC?
Код

var
  hdcIn: HDC;
  hWnd: THandle;
begin
  hWnd := GetDesktopWindow;
  hdcIn := GetDC(hWnd); // получаем контекст окна.
//
BitBlt куда тебе надо из hdcIn в bmp.canvas.handle.
//
  ReleaseDC(hWnd, hdcIn); // освобождаем контекст.
end;


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)