Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

Графика   Найти похожие ветки 

 
Shurick   (2010-05-14 19:44) [0]

Доброва дня!

Потребовалось написать программку после многих лет как оставил сие поприще( и не могу сообразить...

Нужно получение изображение окна сторонней программы в, например TImage, в своей. Проблема возникает если сторонняя форма перекрыта, судорожно пытаюсь припомнить аналог PainTo как у контролов в дельфи. Собственно вопрос, как перенаправить вывод (Handle источника известен)


 
DVM ©   (2010-05-14 22:24) [1]


> Проблема возникает если сторонняя форма перекрыта

без показа хотя бы на время стороннего окна это в общем случае невозможно. Возможно только начиная с висты.


 
Б   (2010-05-14 22:58) [2]


> DVM ©   (14.05.10 22:24) [1]


Зырь.
http://msdn.microsoft.com/en-us/library/dd162869(VS.85).aspx


 
DVM ©   (2010-05-15 00:14) [3]


> Б   (14.05.10 22:58) [2]

не поможет это


 
Б   (2010-05-15 02:00) [4]


> DVM ©   (15.05.10 00:14) [3]


Кто-то страдает криворукостью? ;)


 
MonoLife ©   (2010-05-15 09:01) [5]

>Проблема возникает если сторонняя форма перекрыта
SetForegroundWindow() ?


 
DVM ©   (2010-05-15 09:34) [6]


> Б   (15.05.10 02:00) [4]


> Кто-то страдает криворукостью? ;)

Тебе сделать окно, изображение которого данной функцией ты не снимешь? Элементарно же делается. Сказано же, в общем случае не выйдет.


 
DVM ©   (2010-05-15 09:37) [7]


> Б   (15.05.10 02:00) [4]

По-моему даже снимок блокнота не сделать - там проблемы какие то. И таких окон масса.

Так что надо либо показывать окно, ждать пока оно отрисуется, а потом делать снепшот или под вистой и выше использовать DWM API вот там проблем нету точно.


 
Б   (2010-05-15 10:48) [8]


> DVM ©   (15.05.10 09:34) [6]


> Тебе сделать окно, изображение которого данной функцией ты не снимешь?

Валяй.

> Сказано же, в общем случае не выйдет.

В каком это таком?

> По-моему даже снимок блокнота не сделать - там проблемы какие то. И таких окон масса.

Блокнот, IE, Google Chrome - снимает без проблем.


 
DVM ©   (2010-05-15 11:11) [9]


> Б   (15.05.10 10:48) [8]


> Валяй.

Чуток попозже, сейчас мне некогда, надо бежать. Но сделаю обязательно. Ты и сам можешь легко это сделать, достаточно вставить в оконную процедуру окна "нужный" обработчик WM_PRINT.
Ты пойми, за корректную работу этой функции отвечает само окно, если оно будет противиться этому, должным образом обрабатывая сообщения, то никакого снепшота ты не получишь, несмотря на то, что окно будет прекрасно отображаться на экране. В случае же с виста и выше механизм совсем другой (возможно и поведение этой функции изменено, я не проверял уже), там всегда есть у системы изображения всех окон, так что взять нужное труда не составляет.


> Блокнот, IE, Google Chrome - снимает без проблем.
>
>

Тебе повезло. И ты не указал ОС. А вот у меня помнится в XP для некоторых окон (или их частей) выходили черные квадраты. И не у меня одного как оказалось, достаточно пошерстить интернет на эту тему.


 
Б   (2010-05-15 11:15) [10]


> DVM ©   (15.05.10 11:11) [9]

> Но сделаю обязательно

Вылаживай код, проверим, где работает, а где нет. ;)


>  И ты не указал ОС.


XP.

> В случае же с виста
> Графика [D7, WinXP]
Ни о чём ни говорит?


 
turbouser ©   (2010-05-15 11:20) [11]


> Б   (15.05.10 11:15) [10]
>
>


> Вылаживай код,

Пиши грамотно.


 
Б   (2010-05-15 11:35) [12]


> turbouser ©   (15.05.10 11:20) [11]


http://lurkmore.ru/Grammar_nazi ж)

P.S. И я ещё смею получать высшее... ;D


 
Б   (2010-05-17 05:29) [13]


> DVM ©   (15.05.10 11:11) [9]


> > Но сделаю обязательно


Когда, через год? ;D


 
DVM ©   (2010-05-17 13:21) [14]

unit uMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm1 = class(TForm)
 private
   { Private declarations }
 public
   procedure WMPrint(var Message: TMessage); message WM_PRINT;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMPrint(var Message: TMessage);
begin
 Message.Result := 0;
end;

end.



То, что находится внутри метода WMPrint особой роли не играет, что там окно делает неважно, но снимок такого окна уже не получишь.


 
DVM ©   (2010-05-17 13:24) [15]


> Б   (17.05.10 05:29) [13]

Давно бы уже сам попробовал и убедился, все необходимое выше я объяснил в [9].


 
DVM ©   (2010-05-17 13:54) [16]


> Б   (17.05.10 05:29) [13]

Вот еще вариант такой (похоже именно с  такими окнами у меня были раньше проблемы):


unit uMain;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, XPMan, ComCtrls;

type
 TForm1 = class(TForm)
   xpmnfst1: TXPManifest;
 private
   procedure CreateParams(var Params : TCreateParams); override;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CreateParams(var Params : TCreateParams);
begin
 inherited Createparams(Params);
 with Params.WindowClass do
   style := style or CS_PARENTDC;
end;

end.


 
DVM ©   (2010-05-17 14:01) [17]

Окно из [14] в XP SP2 и новее захватывается нормально, в SP1, по крайней мере у меня, нет. Допустим, этот вариант можно считать маловероятным, т.к. SP1 и ниже найти сложно уже.

А вот окно из [16] в XP SP3 со всеми обновлениями дает в снепшоте черный квадрат, хотя само отрисовывается нормально на экране.

Можно конечно спросить, зачем кому-то понадобилось использовать флаг CS_PARENTDC для стиля класса окна в своей программе, но тем не менее его использование (даже по ошибке) не приводит к каким либо видимым эффектам на экране, но делает проблематичным получение снепшота с пом PrintWindow.


 
Б   (2010-05-17 22:25) [18]


> DVM ©   (17.05.10 13:21) [14]

Снимает без проблем.


> DVM ©   (17.05.10 13:24) [15]
>
> > Б   (17.05.10 05:29) [13]
>
> Давно бы уже сам попробовал и убедился, все необходимое
> выше я объяснил в [9].


> DVM ©   (15.05.10 11:11) [9]
> Чуток попозже, сейчас мне некогда, надо бежать. Но сделаю обязательно.

LOL ;D
Это надо тебе в первую очередь.


 
Б   (2010-05-17 22:28) [19]


> DVM ©   (17.05.10 13:54) [16]


http://www.rsdn.ru/forum/winapi/2082032.flat.1.aspx


 
DVM ©   (2010-05-17 23:09) [20]


> Б   (17.05.10 22:25) [18]


> Снимает без проблем.

а [16] ?


> Это надо тебе в первую очередь.

Мне это как раз нафиг уже не нужно :)


> Б   (17.05.10 22:28) [19]

Да методов масса, в том числе и PrintWindow(), но одной PrintWindow не обойтись.


 
DVM ©   (2010-05-17 23:13) [21]


> Б   (17.05.10 22:28) [19]

Ну так вот сам же привел ссылку на обсуждение того, что PrintWindow работает не всегда, о чем я и заявил в самом начале. Или не так?


 
Б   (2010-05-17 23:21) [22]


> DVM ©   (17.05.10 23:09) [20]


> Мне это как раз нафиг уже не нужно :)


Сначал сам сказал напишу, а теперь на меня перекладываешь. ;D

> а [16] ?

CS_PARENTDC не убирается.


Function XSetStyle(Wnd: LongWord; Enabled: boolean): boolean;
Const
 X_WND_STYLE = CS_PARENTDC;
Var
 Style: LongInt;
begin
 Style:= GetClassLong(Wnd, GCL_STYLE);
 If Enabled then Style:= (Style or X_WND_STYLE)
 else begin
   If ((Style and CS_PARENTDC) <> 0) then
        Style:= Style or not X_WND_STYLE
 end;

 Result:= (SetClassLong(Wnd, GCL_STYLE, Style) <> 0);
End;


> DVM ©   (17.05.10 23:13) [21]

Расширенная версия по ссылке работает.


 
DVM ©   (2010-05-17 23:29) [23]


> Б   (17.05.10 23:21) [22]


> Сначал сам сказал напишу, а теперь на меня перекладываешь.
>  ;D

Я как вернулся сразу написал. Ну что ж поделаешь если 2 дня не было меня.

Кстати, по поводу калькулятора - есть все же с ним глюки при использовании PrintWindow() - когда он в инженерном режиме у него там 2 таких квадратика вдавленных сразу под дисплеем - их нету на получающемся снепшоте под WinXP SP3.


> CS_PARENTDC не убирается.
>

А если бы убиралось, можно было бы покалечить окно.


 
Б   (2010-05-17 23:41) [24]


> DVM ©   (17.05.10 23:29) [23]

> Ну что ж поделаешь если 2 дня не было меня.

Раз пообещал, так делай. ;)

>  их нету

Хм, у меня эти квадратики нормально грабятся.
(XP SP3)

> А если бы убиралось, можно было бы покалечить окно.

Идея была: флаг убрать, заснять, вернуть.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.063 c
15-1268677017
AntonioBanderas
2010-03-15 21:16
2010.08.27
из prn в rtf


15-1265873696
12
2010-02-11 10:34
2010.08.27
Начать писать на php.


15-1270648471
Mozart
2010-04-07 17:54
2010.08.27
Seagate...того?


15-1262712162
Anatoly Podgoretsky
2010-01-05 20:22
2010.08.27
Режим бога в Вигдоус 7


2-1271927418
b86
2010-04-22 13:10
2010.08.27
перевод xls таблицы в stringgrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский