Delphi中使用SetWindowDisplayAffinity的问题

问题描述 投票:0回答:1

我在上一个问题中收到了各种反馈和帮助防止在delphi(亚历山大)中进行屏幕截图或屏幕捕获[重复],经过一些搜索和研究,我发现了以下源代码:

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.Menus, Vcl.ExtCtrls, Vcl.FileCtrl, 
  System.IOUtils, System.Types, System.UITypes, Forms, Math, ShellAPI, Vcl.Imaging.jpeg, 
  Winapi.TlHelp32, PsAPI, System.StrUtils;


type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;


implementation

{$R *.dfm}

uses Unit2;

function SetWindowDisplayAffinity(hWnd: HWND; dwAffinity: DWORD): BOOL; stdcall; external 'user32.dll' name 'SetWindowDisplayAffinity';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; stdcall; external 'user32.dll' name 'ShowWindow';


procedure TForm1.FormCreate(Sender: TObject);
var
 Handle: Winapi.Windows.HWND;
begin
  // Get the handle of the main form window
  Handle := Self.Handle;

  // Set the display affinity of the window to monitor
  SetWindowDisplayAffinity(Handle, WDA_MONITOR);

  // Call SetWindowDisplayAffinity
  if not SetWindowDisplayAffinity(Handle, WDA_MONITOR) then
  begin
    ShowMessage(SysErrorMessage(GetLastError));
  end else
  begin
    ShowMessage('OK');
  end;


  // Show the window
  ShowWindow(Handle, SW_NORMAL);
end;

但是,我仍然无法用我的软件页面替换黑屏或空白页面或阻止捕获我的软件页面。

我的源代码有问题吗?

各位朋友、各位老师,我不打算写安全软件,所以请不要重复回答诸如此方法无效、过时、不实用等。我想学习方法和过程,想必大家都知道。最少的技术知识都知道,使用数码相机或移动相机捕获或记录屏幕是可能的,并且这些方法是无法阻止的。或者通过其他方法如逆向工程等,可以绕过这些限制。

我的目标只是学习,我并不打算写出完美的软件!

预先感谢您的帮助。

这些答案非常有帮助,但我仍然无法在 Delphi 11 Alexandria 中成功使用此方法。 “我在Delphi 11 Alexandria中安装和运行DirectX SDK方法没有成功,所以我更愿意使用SetWindowDisplayAffinity方法来代替。(如果这个方法兼容大多数Windows系统,特别是Windows 7到11,就足够了我。)” https://stackoverflow.com/a/22218857/4299358
Office 2013如何实现IRM黑窗?

delphi winapi affinity
1个回答
0
投票

你的代码在很多方面都很奇怪:

  1. 为什么要调用

    SetWindowDisplayAffinity
    两次(一次没有错误检查,一次有错误检查)?肯定一次就够了不是吗?

  2. 为什么在

    ShowWindow
    处理程序中调用
    OnCreate
    ?为什么您觉得需要自己声明这个函数,而实际上它是
    Windows.pas
    中找到的标准 Windows API 函数?

  3. 为什么您的示例中包含大量单位? (这几乎就像你想要通过制造转移注意力来迷惑我们和你自己!)

我刚刚在 Delphi 12 中创建了一个新的 VCL 应用程序,将

DwmApi
单元添加到
uses
子句中,以及以下
OnClick
处理程序:

procedure TForm1.FormClick(Sender: TObject);
begin
  if not SetWindowDisplayAffinity(Handle, WDA_MONITOR) then
    RaiseLastOSError;
end;

我还在表单中添加了一个按钮(只是为了查看子窗口在屏幕截图中的显示方式)以及表单本身上的一些 GDI 绘图:

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.Brush.Color := clWhite;
  Canvas.FillRect(ClientRect);
  Canvas.Pen.Color := clRed;
  Canvas.Pen.Width := 4;
  Canvas.Ellipse(ClientRect)
end;

现在,我运行该应用程序并(立即)创建它及其邻域的屏幕截图:

然后我单击表单的客户区域(不是按钮)并尝试再次在屏幕截图中捕获它:

通过将对

SetWindowDisplayAffinity
的调用移至表单的
OnCreate
处理程序,它将从一开始就“不可捕获”。

所以关于“在Delphi中使用SetWindowDisplayAffinity的问题”这个问题,我想说这个问题不存在。

© www.soinside.com 2019 - 2024. All rights reserved.