我在上一个问题中收到了各种反馈和帮助防止在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黑窗?
你的代码在很多方面都很奇怪:
为什么要调用
SetWindowDisplayAffinity
两次(一次没有错误检查,一次有错误检查)?肯定一次就够了不是吗?
为什么在
ShowWindow
处理程序中调用 OnCreate
?为什么您觉得需要自己声明这个函数,而实际上它是 Windows.pas
中找到的标准 Windows API 函数?
为什么您的示例中包含大量单位? (这几乎就像你想要通过制造转移注意力来迷惑我们和你自己!)
我刚刚在 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的问题”这个问题,我想说这个问题不存在。