Delphi屏幕截图完美解决方案

屏幕截图完美解决方案 --- LYSoft Liu Yang 可以截取layered窗口(包括透明窗口)的代码:procedure CaptureScreen(AFileName: string);const  CAPTUREBLT = $40000000;var  hdcScreen: HDC;  hdcCompatible: HDC;  bmp: TBitmap;  hbmScreen: HBITMAP;begin  hdcScreen := Cre 阅读详情

可以截取layered窗口(包括透明窗口)的代码:

procedure CaptureScreen(AFileName: string);
const
  CAPTUREBLT = $40000000;
var
  hdcScreen: HDC;
  hdcCompatible: HDC;
  bmp: TBitmap;
  hbmScreen: HBITMAP;
begin
  hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
  hdcCompatible := CreateCompatibleDC(hdcScreen);
  hbmScreen := CreateCompatibleBitmap(hdcScreen,
    GetDeviceCaps(hdcScreen, HORZRES),
    GetDeviceCaps(hdcScreen, VERTRES));
  SelectObject(hdcCompatible, hbmScreen);
  bmp := TBitmap.Create;
  bmp.Handle := hbmScreen;
  BitBlt(hdcCompatible,
    0, 0,
    bmp.Width, bmp.Height,
    hdcScreen,
    0, 0,
    SRCCOPY or CAPTUREBLT);

  bmp.SaveToFile(AFileName);
  bmp.Free;
  DeleteDC(hdcScreen);
  DeleteDC(hdcCompatible);
end;

DX Primary Surface截图代码!包含DX8与DX9两个版本

...
interface

{$DEFINE D3D9}

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons,
{$IFDEF D3D9}
  // D3DX9, // use D3D to save surface
  Direct3D9
{$ELSE}
  // D3DX8, // use D3D to save surface
  Direct3D8
{$ENDIF};
...
procedure TForm1.BitBtn1Click(Sender: TObject);
// Capture screen through D3D.
var
  BitsPerPixel: Byte;
  {$IFDEF D3D9}
  pD3D: IDirect3D9;
  pSurface: IDirect3DSurface9;
  g_pD3DDevice: IDirect3DDevice9;
  {$ELSE}
  pD3D: IDirect3D8;
  pSurface: IDirect3DSurface8;
  g_pD3DDevice: IDirect3DDevice8;
  {$ENDIF}
  D3DPP: TD3DPresentParameters;
  ARect: TRect;
  LockedRect: TD3DLockedRect;
  BMP: TBitmap;
  i, p: Integer;
begin
  BitsPerPixel := GetDeviceCaps(Canvas.Handle, BITSPIXEL);
  FillChar(d3dpp, SizeOf(d3dpp), 0);
  D3DPP.Windowed := True;
  D3DPP.Flags := D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
  D3DPP.SwapEffect := D3DSWAPEFFECT_DISCARD;
  D3DPP.BackBufferWidth := Screen.Width;
  D3DPP.BackBufferHeight := Screen.Height;
  D3DPP.BackBufferFormat := D3DFMT_X8R8G8B8;
  {$IFDEF D3D9}
  pD3D := Direct3DCreate9(D3D_SDK_VERSION);
  pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, GetDesktopWindow,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING, @D3DPP, g_pD3DDevice);
  g_pD3DDevice.CreateOffscreenPlainSurface(Screen.Width, Screen.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, pSurface, nil);
  g_pD3DDevice.GetFrontBufferData(0, pSurface);
  {$ELSE}
  pD3D := Direct3DCreate8(D3D_SDK_VERSION);
  pD3D.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_REF, GetDesktopWindow,
    D3DCREATE_SOFTWARE_VERTEXPROCESSING, D3DPP, g_pD3DDevice);
  g_pD3DDevice.CreateImageSurface(Screen.Width, Screen.Height, D3DFMT_A8R8G8B8, pSurface);
  g_pD3DDevice.GetFrontBuffer(pSurface);
  {$ENDIF}
  // use D3D to save surface. Notes: D3DX%ab.dll is required!
//  D3DXSaveSurfaceToFile('Desktop.bmp', D3DXIFF_BMP, pSurface, nil,  nil);
  // use Bitmap to save surface
  ARect := Screen.DesktopRect;
  pSurface.LockRect(LockedRect, @ARect, D3DLOCK_NO_DIRTY_UPDATE or D3DLOCK_NOSYSLOCK or D3DLOCK_READONLY);
  BMP := TBitmap.Create;
  BMP.Width := Screen.Width;
  BMP.Height := Screen.Height;
  case BitsPerPixel of
    8:  BMP.PixelFormat := pf8bit;
    16: BMP.PixelFormat := pf16bit;
    24: BMP.PixelFormat := pf24bit;
    32: BMP.PixelFormat := pf32bit;
  end;
  p := Cardinal(LockedRect.pBits);
  for i := 0 to Screen.Height - 1 do
    begin
      CopyMemory(BMP.ScanLine[i], Ptr(p), Screen.Width * BitsPerPixel div 8);
      p := p + LockedRect.Pitch;
    end;
  BMP.SaveToFile('Desktop.bmp');
  BMP.Free;
  pSurface.UnlockRect;
end;


 

以上DX截图代码,不需要额外的DLL支持,有DirectX 9.0即可
采用上面的2个方案以外,还有些视频播放器的图像不能截取吧,呵呵
怎么解决呢?
它们使用的,是称为"覆盖表面"的技术,截取覆盖表面,需要Hook的手段才行

思路是:
通过Hook DDraw的DirectDrawCreate(RealOne用)同DirectDrawCreateEx(WMP用)
获得IDirectDraw(7)
再COM Hook CreateSurface,注意RealOne使用的是通过QueryInterface获得IDirectDraw2
WMP则是IDirectDraw7
Hook了CreateSurface后,就能获得OverlaySurface
所以必须在软件使用前,启动全局Hook,才有效
在需要截图的时候
Lock Overlay Surface,读取数据,马上Unlock,以免损失性能
解码读出来的数据,即可,但是由于获得的数据是显卡硬件VRAM的数据,一般是YUY2,YV12等格式,需要转换为RGB格式
例如,在我的GF6600上,RealOne(RMVB)用的是YUY2,而WMP(AVI)用的是YV12,还与当前播放的文件格式有关提供主表面截图源码和覆盖表面截图的测试程序http://lysoft.lz169.com/projects/DXCapture.rar
现在支持YV12,NV12,YUY2,UUVY 4个格式

Tag:
 
Delphi仿QQ截屏功能.rar Delphi仿QQ截屏功能,可区域截图,鼠标拖选区域,作者:杨畅,我为人人,人人为我。希望大家一起交流,共同进步。定义区域截图时用到的变量,所选区域已截取并复制到了剪贴板!可在其它程序中粘贴!提示:请右键单击图标设置截图热键!不要设置成系统已注册的热键以免冲突。默认全屏截图:Ctrl S,区域截图:Ctrl Q。   //创建程序参数保存文件qscreen.ini在windows目录   qscreeninifile:= TInifile.Create('qscreen.ini');   //读取参数文件qscreen.ini中dxCheckbox2的值,若不存在默认为True   dxCheckbox2.Checked := qscreeninifile.ReadBool('dxCheckbox2', '是否提示', True);   //读取参数文件qscreen.ini中HotKey1的值, 若不存在默认为16449即Ctrl A   HotKey1.HotKey:=qscreeninifile.Readinteger('HotKey1', '全屏截图热键', 16467);   //读取参数文件qscreen.ini中HotKey2的值, 若不存在默认为16465即Ctrl Q   HotKey2.HotKey:=qscreeninifile.Readinteger('HotKey2', '区域截图热键', 16465);   //注册两个默认的热键   HotKeyIndex1 := HotKeyManager1.AddHotKey(HotKey1.HotKey);   HotKeyIndex2 := HotKeyManager1.AddHotKey(HotKey2.HotKey);   //读取注册表中的自动启动项,以设置dxCheckbox1状态   Regtemp:=TRegistry.Create;   Regtemp.RootKey:=HKEY_LOCAL_MACHINE;   当程序设置窗体关闭时,更新参数保存文件qscreen.ini中关键字的值。 立即下载

相关推荐

参照QQ的截屏功能写的Delphi小程序

内容索引:Delphi源码,图形处理,截屏,抓图,仿QQ  参照QQ的截屏功能写的Delphi小程序,打开程序后在任务栏显示图标,点击右键选择“设置”,在这里设置一下抓图的快捷键,你就可以使用本程序了,它分为区域和全屏截图两种模式,可设置程序随Windows一起启动以及快速截屏提示等功能,为了程序界面好看一点,这里使用了一个控件,请多包涵。

Delphi实现屏幕截图、窗口截图、指定区域截图

Use Jpeg procedure TForm1.snapscreen(a,b,c,d:Integer); var bmpscreen:Tbitmap; jpegscreen:Tjpegimage; FullscreenCanvas:TCanvas; dc:HDC; sourceRect, destRect: TRect; begin try dc:=get...

dkopg24406的专栏 3296

delphi超级漂亮的仿QQ屏幕截屏程序

delphi编写的超级漂亮的仿QQ屏幕截屏DLL源码,可以区域截图,调整大小,窗口截图和全屏截图

用delphi实现完美屏幕截图

可以截取layered窗口(包括透明窗口)的代码: procedure CaptureScreen(AFileName: string);const CAPTUREBLT = $40000000;var hdcScreen: HDC; hdcCompatible: HDC; bmp: TBitmap; hbmScreen: HBITMAP;begin hdcScreen := Cre...

weixin_30729609的博客 280

delphi 截图 仿QQ

delphi 仿QQ界面屏幕截图

Delphi 全屏抓图、截屏,区域截图代码,支持滚屏

内容索引:Delphi源码,图形处理,Capture.rar  Delphi 全屏抓图、常规截屏,区域截图,活动窗口抓图代码,支持滚屏截图功能。截屏完毕,可打印,可保存为指定格式,可显示图片信息,代码可在delphi7中直接编译成功。源代码完整,程序功能虽然还有不完善的地方,但如果对抓图截屏功能不熟悉的朋友,本源码可作为你一个很好的范例参考。

Delphi下的OpenGL开发入门

原文地址: 概要:这篇文章犹如循序渐进教人做菜的食谱,使Delphi开发者获得OpenGL 3D 图形编程的有效知识。 作者:Alex Semichastny OpenGL最初是由Silicon图形公司开发的底层图形库规范。你的系统中准确实现这个规范的部分,通常被称为OpenGL驱动,它允许你使用几何集合(点,线,多边形,图像等等)来描述你希望表现的场景。让肉眼观察起来较为舒适的中等规模场

被遗忘的遐想空间 1602

Delphi 超强截图工具(支持区域、滚屏等截图)

Delphi 超强截图工具(支持区域、滚屏等截图,支持DELPHI 7.欢迎大家下载。

Delphi下的OpenGL开发入门(翻)

Delphi下的OpenGL开发入门(翻) -->2004-4-25 | 13:35 (GMT 0) <!--8:34am | 10.14.03 -->原文地址:http://bdn.borland.com/article/0,1410,26401,00.html概要:这篇文章犹如循序渐进教人做菜的食谱,使Delphi开发者获得OpenGL 3D 图形编程的

代码人生 2258

Delphi调用QQCameraDll截屏截图程序源码A小但稳定.rar_delphi_delphi 截屏_截图_截屏_调用QQ

调用QQCameraDll截屏截图程序源码A:小而稳定,稍作修改可用于程序调用.

嵌入式存储进阶:除了KV存储,EasyFlash的IAP和LOG功能怎么玩?

本文深入探讨了嵌入式存储方案EasyFlash的高级功能,包括在线固件升级(IAP)和闪存日志存储(LOG)。通过详细解析IAP的双区备份设计和LOG的环形缓冲区架构,提供硬件适配、安全升级流程和日志管理技巧等实战指南,帮助开发者在物联网设备中实现可靠的数据存储和固件更新。

weixin_29280219的博客 414

使用Delphi开发混凝土生产车间自动化过程控制系统的仿真系统

本文介绍了混凝土、沥青等散装物料生产企业的Delphi开发自动化控制系统开发经验。团队采用自主研发方式,从电路板制作到软件编写全程把控,避免了SCADA系统的依赖。重点阐述了自主开发的设备模拟器系统:通过Delphi编写程序模拟ModbusRTU协议和设备运行状态,实现输入输出模块、称重控制器的全流程测试。该系统支持保存/加载特定工厂配置,能模拟设备故障、通信中断等异常情况,显著提高了测试效率和质量。文章还详细说明了设备通信的"命令"模式实现,包括多队列并行处理、优先级管理等关键技术。

Delphi开发局QQ群:32422310 427

IEEE802.11bf: WLAN Sensing Standard

下表为IEEE802.11bf 定义的使用情境 (Use Cases)

qinsd19的博客 1061

delphi 数字识别_OCR文字识别工具itext

itext mac是一款从图片中识别文字的OCR(光学字符识别)工具。通过截图、拖拽图片,即可以从扫描版的PDF等任意图片中识字,并且可以很好的解决摘抄和批注需求。而且itext ma使用腾讯、Google 双引擎,识别效果惊人地准确。iText for Mac(简单易用的OCR文字识别工具)​mac.orsoon.comiText支持多种方式选择图像,操作非常方便。iText内置屏幕捕获工具。只...

weixin_39797532的博客 1418

UE5在Ubuntu22.04.4下的高效开发环境配置指南

本文详细介绍了在Ubuntu 22.04.4系统上配置UE5高效开发环境的完整指南,包括系统准备、显卡驱动安装、UE5引擎编译与配置、开发工具链设置以及性能优化技巧。通过逐步指导,帮助开发者快速搭建稳定的UE5开发环境,解决常见问题,提升开发效率。

weixin_29251131的博客 383

华为OD机试 - 矩形绘制 - 数组、坐标偏移(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。实现一个简单的绘图模块,绘图模块仅支持矩形的绘制和擦除。 当新绘制的矩形与已有图形重叠时,对图形取并集; 当新擦除的矩形与已有图形重叠时,对图形取差集。 给定一系列绘制和擦除操作,计算最终图形的面积。第一行为操作数N,接下来的N行格式为:d x1

学Java,找哪吒 836
上一篇: 《黑客道简史》(A Brief History of Hackerdom)序言:真正的程序师
下一篇: 黑洞2007自定义协议版本 演示穿越卡巴6和ZA防火墙
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值