大家早上好。
我目前正在尝试编写一个小型应用程序,该应用程序是围绕通过Windows提供的特性(例如,DWM缩略图)构建的。其中一个特性是能够动态地从应用程序中选择缩略图的一个区域,并将其放大/放大。也许可以用某种“设置区域”函数从DWM中实现这一点,但我想先尝试一下自己的路径,然后再深入到API中。
在最近发现了Delphi的一个例子之后,我希望从演示中进行扩展,并构建一些更具体的东西。我开始将代码移到Firemonkey FM2应用程序中(与VCL相比,我更喜欢框架的可视化功能)。经过几次调整,我成功地构建了它,但不幸的是,尽管VCL版本运行得完美无缺,但在FMX应用程序中运行时,DWMRegisterThumbnail似乎无法返回有效的结果。
然后我再往前看,决定给九头蛇一次机会。我将工作的VCL示例复制到一个Hydra插件中,并创建了一个Fire猴子主机应用程序。我正确地设置了两个部分并进行了编译。DLL正确加载,我可以看到预期的FMX主机内的VCL插件接口。然而,在试图查看窗口的DWM缩略图时,我再次遇到了运行非水电FMX应用程序时遇到的相同问题。
然后,我开始创建一个VCL主机应用程序,以确保它不是特定于VCL交互的问题。我编译了VCL主机,加载到VCL插件中,再次可以看到VCL主机中的VCL插件。然而,我仍然发现我无法从DWM中查看缩略图。显然,这不是火猴-VCL的交互问题。
因此,我得出结论,从DLL运行DWM代码是一个问题。理想情况下,我希望有一个FMX主机应用程序,因为它更容易让我把TSelection放在缩略图上,并以这种方式处理缩放(例如,很少的代码,不需要寻找自定义组件),更不用说额外的奖励了,比如MakeScreenshot。
因此,要切入主题;是否可以从九头蛇插件中调用DWM,并/或将DWM图钉输出到火猴表面?。
在我的九头蛇插件中使用的代码与链接示例中使用的代码相同,在我的主机应用程序中使用的代码是基于Remobject Youtube频道上的简单示例。
发布于 2013-02-20 05:00:57
如果没有源代码,我猜您没有将正确的窗口句柄传递给DwmRegisterThumbnail函数。您可以使用FmxHandleToHWND函数将FMX窗体句柄转换为Windows句柄。
尝试此修改后的代码版本
unit Unit28;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, Winapi.Windows, Winapi.DwmApi;
type
TForm28 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FTumbnail: HTHUMBNAIL;
FPreviewEnabled: Boolean;
{ Private declarations }
procedure PreviewWindow(const ASource, ADest: HWND; const ARect: TRect);
procedure PreviewDisable;
public
{ Public declarations }
end;
var
Form28: TForm28;
implementation
uses
FMX.Platform.Win;
{$R *.fmx}
procedure TForm28.Button1Click(Sender: TObject);
var
Index: Integer;
LRect: TRect;
begin
LRect := Rect(5, 5, Self.Width -20,Self.Height -50);
//here I'm using a fixed window handle ($000102EE) just a sample
PreviewWindow($000102EE, FmxHandleToHWND(Self.Handle), LRect);
end;
procedure TForm28.FormCreate(Sender: TObject);
begin
FPreviewEnabled := False;
end;
procedure TForm28.FormDestroy(Sender: TObject);
begin
PreviewDisable;
end;
procedure TForm28.PreviewDisable;
begin
if FPreviewEnabled then
FPreviewEnabled := NOT Succeeded(DwmUnregisterThumbnail(FTumbnail));
end;
procedure TForm28.PreviewWindow(const ASource, ADest: HWND; const ARect: TRect);
var
LResult: HRESULT;
LThumpProp: DWM_THUMBNAIL_PROPERTIES;
begin
if not DwmCompositionEnabled then begin
ShowMessage('DWM composition is NOT enabled.');
Exit;
end;
PreviewDisable;
FPreviewEnabled := Succeeded(DwmRegisterThumbnail(ADest, ASource, @FTumbnail));
if FPreviewEnabled then
begin
LThumpProp.dwFlags := DWM_TNP_SOURCECLIENTAREAONLY or DWM_TNP_VISIBLE or DWM_TNP_OPACITY or DWM_TNP_RECTDESTINATION;
LThumpProp.fSourceClientAreaOnly := False;
LThumpProp.fVisible := True;
LThumpProp.opacity := 200;
LThumpProp.rcDestination := ARect;
LResult := DwmUpdateThumbnailProperties(FTumbnail, LThumpProp);
FPreviewEnabled := (LResult = S_OK);
end else
ShowMessage('Cannot link to window ' + IntToStr(ASource));
end;
end.

https://stackoverflow.com/questions/14971762
复制相似问题