-
Доброва дня!
Потребовалось написать программку после многих лет как оставил сие поприще( и не могу сообразить...
Нужно получение изображение окна сторонней программы в, например TImage, в своей. Проблема возникает если сторонняя форма перекрыта, судорожно пытаюсь припомнить аналог PainTo как у контролов в дельфи. Собственно вопрос, как перенаправить вывод (Handle источника известен)
-
> Проблема возникает если сторонняя форма перекрыта
без показа хотя бы на время стороннего окна это в общем случае невозможно. Возможно только начиная с висты.
-
-
> Б (14.05.10 22:58) [2]
не поможет это
-
> DVM © (15.05.10 00:14) [3]
Кто-то страдает криворукостью? ;)
-
>Проблема возникает если сторонняя форма перекрыта SetForegroundWindow() ?
-
> Б (15.05.10 02:00) [4]
> Кто-то страдает криворукостью? ;)
Тебе сделать окно, изображение которого данной функцией ты не снимешь? Элементарно же делается. Сказано же, в общем случае не выйдет.
-
> Б (15.05.10 02:00) [4]
По-моему даже снимок блокнота не сделать - там проблемы какие то. И таких окон масса.
Так что надо либо показывать окно, ждать пока оно отрисуется, а потом делать снепшот или под вистой и выше использовать DWM API вот там проблем нету точно.
-
> DVM © (15.05.10 09:34) [6]
> Тебе сделать окно, изображение которого данной функцией ты не снимешь?
Валяй. > Сказано же, в общем случае не выйдет.
В каком это таком?
> По-моему даже снимок блокнота не сделать - там проблемы какие то. И таких окон масса.
Блокнот, IE, Google Chrome - снимает без проблем.
-
> Б (15.05.10 10:48) [8]
> Валяй.
Чуток попозже, сейчас мне некогда, надо бежать. Но сделаю обязательно. Ты и сам можешь легко это сделать, достаточно вставить в оконную процедуру окна "нужный" обработчик WM_PRINT. Ты пойми, за корректную работу этой функции отвечает само окно, если оно будет противиться этому, должным образом обрабатывая сообщения, то никакого снепшота ты не получишь, несмотря на то, что окно будет прекрасно отображаться на экране. В случае же с виста и выше механизм совсем другой (возможно и поведение этой функции изменено, я не проверял уже), там всегда есть у системы изображения всех окон, так что взять нужное труда не составляет.
> Блокнот, IE, Google Chrome - снимает без проблем. > >
Тебе повезло. И ты не указал ОС. А вот у меня помнится в XP для некоторых окон (или их частей) выходили черные квадраты. И не у меня одного как оказалось, достаточно пошерстить интернет на эту тему.
-
> DVM © (15.05.10 11:11) [9]
> Но сделаю обязательно
Вылаживай код, проверим, где работает, а где нет. ;)
> И ты не указал ОС.
XP.
> В случае же с виста > Графика [D7, WinXP] Ни о чём ни говорит?
-
> Б (15.05.10 11:15) [10] > >
> Вылаживай код,
Пиши грамотно.
-
-
> DVM © (15.05.10 11:11) [9]
> > Но сделаю обязательно
Когда, через год? ;D
-
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 особой роли не играет, что там окно делает неважно, но снимок такого окна уже не получишь.
-
> Б (17.05.10 05:29) [13]
Давно бы уже сам попробовал и убедился, все необходимое выше я объяснил в [9].
-
> Б (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
procedure TForm1.CreateParams(var Params : TCreateParams);
begin
inherited Createparams(Params);
with Params.WindowClass do
style := style or CS_PARENTDC;
end;
end.
-
Окно из [14] в XP SP2 и новее захватывается нормально, в SP1, по крайней мере у меня, нет. Допустим, этот вариант можно считать маловероятным, т.к. SP1 и ниже найти сложно уже.
А вот окно из [16] в XP SP3 со всеми обновлениями дает в снепшоте черный квадрат, хотя само отрисовывается нормально на экране.
Можно конечно спросить, зачем кому-то понадобилось использовать флаг CS_PARENTDC для стиля класса окна в своей программе, но тем не менее его использование (даже по ошибке) не приводит к каким либо видимым эффектам на экране, но делает проблематичным получение снепшота с пом PrintWindow.
-
> 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 Это надо тебе в первую очередь.
-
-
> Б (17.05.10 22:25) [18]
> Снимает без проблем.
а [16] ?
> Это надо тебе в первую очередь.
Мне это как раз нафиг уже не нужно :)
> Б (17.05.10 22:28) [19]
Да методов масса, в том числе и PrintWindow(), но одной PrintWindow не обойтись.
-
> Б (17.05.10 22:28) [19]
Ну так вот сам же привел ссылку на обсуждение того, что PrintWindow работает не всегда, о чем я и заявил в самом начале. Или не так?
-
> 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] Расширенная версия по ссылке работает.
-
> Б (17.05.10 23:21) [22]
> Сначал сам сказал напишу, а теперь на меня перекладываешь. > ;D
Я как вернулся сразу написал. Ну что ж поделаешь если 2 дня не было меня.
Кстати, по поводу калькулятора - есть все же с ним глюки при использовании PrintWindow() - когда он в инженерном режиме у него там 2 таких квадратика вдавленных сразу под дисплеем - их нету на получающемся снепшоте под WinXP SP3.
> CS_PARENTDC не убирается. >
А если бы убиралось, можно было бы покалечить окно.
-
> DVM © (17.05.10 23:29) [23]
> Ну что ж поделаешь если 2 дня не было меня.
Раз пообещал, так делай. ;)
> их нету
Хм, у меня эти квадратики нормально грабятся. (XP SP3)
> А если бы убиралось, можно было бы покалечить окно.
Идея была: флаг убрать, заснять, вернуть.
|