用delphi在屏幕截图中显示鼠标光标

2023-12-09

你好,我正在制作一个delphi xe功能,该功能是截图,一切顺利,但问题是我在任何拍摄的图像上都看不到鼠标光标。

代码如下:

procedure capturar_pantalla(nombre: string);

// Credits :
// Based on : http://www.delphibasics.info/home/delphibasicssnippets/screencapturewithpurewindowsapi
// Thanks to  www.delphibasics.info and n0v4

var

  uno: integer;
  dos: integer;
  cre: hDC;
  cre2: hDC;
  im: hBitmap;
  archivo: file of byte;
  parriba: TBITMAPFILEHEADER;
  cantidad: pointer;
  data: TBITMAPINFO;

begin


  // Start

  cre := getDC(getDeskTopWindow);
  cre2 := createCompatibleDC(cre);
  uno := getDeviceCaps(cre, HORZRES);
  dos := getDeviceCaps(cre, VERTRES);
  zeromemory(@data, sizeOf(data));


  // Config

  with data.bmiHeader do
  begin
    biSize := sizeOf(TBITMAPINFOHEADER);
    biWidth := uno;
    biheight := dos;
    biplanes := 1;
    biBitCount := 24;

  end;

  with parriba do
  begin
    bfType := ord('B') + (ord('M') shl 8);
    bfSize := sizeOf(TBITMAPFILEHEADER) + sizeOf(TBITMAPINFOHEADER)
      + uno * dos * 3;
    bfOffBits := sizeOf(TBITMAPINFOHEADER);
  end;

  //

  im := createDIBSection(cre2, data, DIB_RGB_COLORS, cantidad, 0, 0);
  selectObject(cre2, im);

  bitblt(cre2, 0, 0, uno, dos, cre, 0, 0, SRCCOPY);

  releaseDC(getDeskTopWindow, cre);

  // Make Photo

  AssignFile(archivo, nombre);
  Rewrite(archivo);

  blockWrite(archivo, parriba, sizeOf(TBITMAPFILEHEADER));
  blockWrite(archivo, data.bmiHeader, sizeOf(TBITMAPINFOHEADER));
  blockWrite(archivo, cantidad^, uno * dos * 3);

end;

当我让鼠标光标出现在屏幕截图中时,有人可以解释一下吗?


这是您尝试执行的操作的更清晰的实现,以及演示如何使用它的控制台应用程序。 (由于捕获屏幕的时间,它会抓住“应用程序忙”光标,因为调用是在应用程序仍在加载时进行的。)您可以在需要时弄清楚如何调用它,以便获得正确的信息光标。

鼠标光标捕获归功于 Zarko(托尼的链接)。我不久前在这里找到的屏幕捕获代码(并且有给予作者的学分,但它在另一台机器上) - 明天当我回到该系统时我将更新这篇文章。

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows, Graphics;

procedure DrawCursor (ACanvas:TCanvas; Position:TPoint) ;
var
  HCursor : THandle;
begin
  HCursor := GetCursor;
  DrawIconEx(ACanvas.Handle, Position.X, Position.Y,
              HCursor, 32, 32, 0, 0, DI_NORMAL) ;
end;

function CaptureWindow(const WindowHandle: HWnd): TBitmap;
var
  DC: HDC;
  wRect: TRect;
  CurPos: TPoint;
begin
  DC := GetWindowDC(WindowHandle);
  Result := TBitmap.Create;
  try
    GetWindowRect(WindowHandle, wRect);
    Result.Width := wRect.Right - wRect.Left;
    Result.Height := wRect.Bottom - wRect.Top;
    BitBlt(Result.Canvas.Handle, 
           0, 
           0, 
           Result.Width, 
           Result.Height, 
           DC, 
           0, 
           0, 
           SRCCOPY);
    GetCursorPos(CurPos);
    DrawCursor(Result.Canvas, CurPos);
  finally
    ReleaseDC(WindowHandle, DC);
  end;
end;

// Sample usage starts here
var
  Bmp: TBitmap;

begin
  Bmp := CaptureWindow(GetDesktopWindow);
  Bmp.SaveToFile('D:\TempFiles\FullScreenCap.bmp');
  Bmp.Free;
  WriteLn('Screen captured.');
  ReadLn;
end.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用delphi在屏幕截图中显示鼠标光标 的相关文章

  • 如何从该 JAVA 文件中提取 Delphi 类以与 Android 一起使用?

    我的Delphi XE7项目需要与FTDI FT311 Android 配件芯片 http www ftdichip com Products ICs FT311D html 他们帮助提供了一个 Android 演示 其中包括他们的 JAV
  • 如何在Delphi中将对象方法作为参数传递,然后调用它?

    我担心这可能是一个有点愚蠢的问题 但这让我很难过 我正在寻找将对象的方法传递到过程中的最简单的方法 以便过程可以调用对象的方法 例如 超时后 或者可能在不同的线程中 所以基本上我想 捕获对对象方法的引用 将该引用传递给过程 使用该引用 从过
  • CharInSet 不适用于非英文字母?

    我已经将应用程序从 Delphi 2007 更新到 Delphi 2010 一切都很顺利 除了一条编译正常但不起作用的语句 If Edit1 Text 1 in S then ShowMessage Found else ShowMessa
  • Delphi - Indy - 保存 GMail 草稿

    我一直在 Delphi 下使用 Indy 通过 gmail 帐户发送消息 使用 TIdSMTP 和 TIdMessage 组件 这绝对没问题 但是 我的客户请求将消息保存到 DRAFTS 文件夹 以便他在实际发送消息之前对 以编程方式创建的
  • Delphi 的内存分析工具?

    我建立了一个项目并运行它 然后在 Process Explorer 中查看它 结果发现它在启动时使用的 RAM 比我想象的要多 5 倍 现在 如果我的程序运行得太慢 我会将其连接到分析器并让它告诉我什么正在使用我的所有周期 有没有类似的工具
  • 如何在按键时识别 unicode 键?

    我的应用程序使用 unicode 字符 并且我有几个文本字段 我想限制用户输入特殊字符 例如 begin if not Key in a z A Z 0 9 13 8 then Key 0 if Key 13 then bOk Click
  • TFrame继承重构

    我提出的另一个 TFrame IDE 注册组件问题 感谢各位程序员的帮助 尝试 Darrian 的 TFrame 继承建议here https stackoverflow com questions 382562 delphi visual
  • Delphi Prism 中 TStringList 的替代品。

    我正在将用 Delphi 2007 Net 编写的应用程序迁移到 Delphi Prism 哪个是替换 TStringList 和 TStrings 类的最佳选择 提前致谢 Bye 只需使用 NET 框架中内置的 List 类型 或者字符串
  • (发件人:TObject)

    发件人 TObject 是什么意思 如 procedure TForm1 Button1Click Sender TObject var s Integer begin end Sender 是对触发事件的组件的引用 在这种情况下 Send
  • 如何修复这个 delphi 7 编译错误 - “重复资源”

    我正在尝试编译我继承的 Delphi 7 项目 但收到此错误 错误 警告 重复资源 错误 类型 2 位图 ID 编辑 错误 文件 C 路径缩短 common CRGrid res 资源已保留 文件 c common raptree RES
  • 面向 Delphi 开发人员的 Qt

    有人知道为 Delphi C Builder VCL 开发人员解释 Qt 的书籍或教程吗 对于具有该背景的开发人员来说 学习 Qt 的最佳方法是什么 我对如何使用 Qt 完成我知道如何在 Delphi 中完成的事情特别感兴趣 例如 Qt 相
  • 在 Delphi 中获取 TCheckbox 的总大小,包括框和文本

    我想获得 TCheckbox 的总大小 包括 Delphi 中的框和文本 我查看这篇文章Delphi FMX TCheckbox TRadiobutton 自动调整大小 https stackoverflow com questions 4
  • Soap Delphi 客户端因 1MB 调用超时而结束

    我们正在开发 SOAP Web 服务 Apache PHP 所有小规模调用都运行良好 但对于 1Mb 的 Soap 调用 HTTPS 调用大小为 1MB 我们的 Delphi Soap 客户端在除一台 PC 之外的所有 PC 上都因超时而停
  • Delphi 是否在构造对象之前分配变量?

    Delphi 是否在对象完全构造之前分配实例变量 换句话说 给定一个变量 var customer TCustomer nil 然后我们构造一个客户并将其分配给变量 customer TCustomer Create 有没有可能custom
  • 在 XMLDocument 中使用 DocumentElement 时发生访问冲突

    当我尝试使用时 我总是遇到访问冲突DocumentElement of the XMLDocument 我创造XMLDocument基于某些文件的存在 错误信息 项目project1 exe引发异常类EAccessViolation 消息
  • Delphi:如何计算大文件的 SHA 哈希值

    您好 我需要生成 5 Gig 文件的 SHA 您知道有一个非基于字符串的 Delphi 库可以做到这一点吗 你应该使用DCPcrypt v2 http www cityinthesky co uk cryptography html读取缓冲
  • 使用 (Object as TClass) 和 TClass(Object) 进行强制转换有什么区别

    有问题在哪里MyObj classnameis TMyClass classname 是真的并且TMyClass MyObj 有效但是 MyObj as TMyclass doSomething抛出转换错误 我真的不需要任何关于这些垃圾的帮
  • SSL 错误 1409442E 使用 TIdHTTP 通过 HTTPS 下载文件 [重复]

    这个问题在这里已经有答案了 我正在使用德尔福10 3 3 下面的代码曾经有效 但现在尝试通过 HTTPS 下载文件时遇到错误 连接 SSL 错误错误 1409442E SSL 例程 SSL3 READ BYTES tlsv1 警报协议版本
  • 如何在Delphi中实现人工神经网络? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想要一个人工神经网络 42 个输入神经元 168 个隐藏神经元 7个输出神经元 这个网络就是玩 连四子 的游戏 每场比赛结束时 网络
  • 如何指定从 Delphi TStream 读取的组件的所有者?

    我正在从流中读取组件 并且希望能够指定 Owner 属性 var TComponent comp stream Seek 0 soFromBeginning comp stream ReadComponent nil 谁拥有 comp 我该

随机推荐

  • Laravel 5中使用ajax从表中删除记录

    我想用ajax删除记录 view foreach products as product tr td product gt code td td product gt name td td product gt display td td
  • Excel 迭代工作表

    我有一个包含许多工作表的工作簿 如果前面的单元格与给定的字符串匹配 我需要在其中输入一个值 我的代码适用于我需要的工作表 但当它到达一些不需要的工作表 其中也有数据 时 它会出错 调试器突出显示的行是For Each r In Inters
  • 在 HTA 文件中使用 Javascript 从 Windows 注册表中读取/写入

    我目前正在尝试编写 Javascript 以便在 HTA 文件中读取和写入 Windows 注册表 这是我当前用来编写的代码 writeInRegistry function sRegEntry sRegValue Regpath HKEY
  • python pickle.dumps 断言错误

    我正在尝试腌制一个包含另一个实例的两个列表的类实例 两个列表中的实例具有引用彼此实例的属性 这是课程 import pickle from copy import copy class Graph def init self self ve
  • 如何匹配所有国际化文本?

    我正在执行一项搜索并销毁亚马逊认为令人厌恶的任何东西的任务 过去我通过使用来处理这个问题iconv从 UTF 8 转换为 latin1 但我不能在这里这样做 因为它被编码为 未知 test lt Gwena xeblle M gt gsub
  • 写入和读取文件时的奇怪行为

    执行以下代码时 第二次读取后 文件将被填充为零 直到达到 4096 字节大 我不明白为什么 f open file txt w f read gives f write Hello f read filled with x00 x00 f
  • System.Data.dll 中发生“System.InvalidOperationException”类型的未处理异常

    我正在 Visual Studio 2008 的 SQL Server 2008 Management Studio 版本中创建与数据库的连接 我在数据库中存储了一个名为 CTable 的过程 并且我想执行它 从 Visual Studio
  • 如何在C++中删除非空目录?

    在 C 中 如何删除目录及其包含的所有文件 我知道有rmdir 但它只会删除非空目录 那么如何首先列出并删除所有包含的文件 我知道使用 Boost Filesystem 应该不难 但我有点想避免仅仅为了这个小任务而构建和依赖它 是的 您通常
  • 时间输入字段[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在构建一个表单来接受时
  • fopen 在 ios 上的奇怪行为

    我试图通过 fopen 创建一个文件然后写入它 但是发生了奇怪的事情 当我将 iPhone 插入 USB 端口时 一切正常 按预期在 tmp 目录或文档目录中创建一个文件 当我拔掉设备并执行同样的操作时 该文件没有出现 我想知道为什么 我使
  • 如何解决 webpack 5 中的 polyfill 问题?

    如果我只是将下一个 js 添加到样板 Visual Studio 2022 React JS 应用程序中 我就会开始收到错误 具体来说 在向导中创建项目 并验证其运行 后 如果我在终端中执行此操作 npm i next 然后将以下行添加到我
  • Xamarin 绑定“包装类型”缺少其本机 ObjectiveC 类

    我正在尝试将外部附件 MSR SDK 绑定到 Xamarin 请注意 这是在设备上 它在模拟器中根本不起作用 我不断收到此错误 Wrapper type iMagProII IMag is missing its native Object
  • 在 NodeJs 中从 type: 'image/png' 转换为 ZPL

    我正在做和尝试的事情 我正在尝试将从 获取的屏幕截图转换为 NodeJS 中的 ZPL 字符串 很像http labelary com viewer html这将获取图像并输出 ZPL 代码 我在做什么 我正在使用一个名为 domToIma
  • 在Python中使用阿拉伯语WordNet作为同义词?

    我试图在句子中找到阿拉伯语单词的同义词 如果这个单词是英语 它就可以完美地工作 并且结果以阿拉伯语显示 我想知道是否可以立即获得阿拉伯语单词的同义词 而无需先用英语编写它 我尝试过 但没有成功 我更喜欢没有 tashkeel nart 而不
  • 为什么 swift 这里使用结构体而不是字符串作为字典键?

    Why UIImagePickerController InfoKey类型是结构而不是字符串 使用结构而不是字符串作为字典键有什么好处 public struct InfoKey Hashable Equatable RawRepresen
  • 通过单击按钮以另一种形式更改文本

    我一直在尝试通过单击 Form2 中的按钮 form2 中的button1 是 STARTA 来更改 Form1 中文本框的文本 现在可能花了 2 个小时 我是编程新手 我一直在寻找类似的问题并发现了很多 但即使在尝试了很多之后我也无法让它
  • 在java中查找天数差异

    在咨询了几个论坛后 我最终使用下面的代码来查找天数差异 但是 我发现逻辑有问题 可能是我的疏忽 我发现 11 至 14 日和 11 至 15 日之间的天数差异是相同的 这怎么可能 Date createdDate new Date 2013
  • 颤动 ListView 滚动到索引不可用

    我需要什么 我想按某个索引滚动列表 我该怎么做 我知道的 scrollToIndex应该从第 n 个索引开始 但是我们如何滚动到任意索引呢 不幸的是 ListView没有内置的scrollToIndex 函数方法 您必须开发自己的方法来测量
  • 如何通过成员变量调用函数?

    玩弄 Rust 我将一些代码提取到一个类中 为了保持它独立但独立的功能 我想保留一个回调函数并稍后调用它 为了保持简单 包括跳过明显的内容fn new 我们有这样的东西 pub struct Toy go fn count i16 gt S
  • 用delphi在屏幕截图中显示鼠标光标

    你好 我正在制作一个delphi xe功能 该功能是截图 一切顺利 但问题是我在任何拍摄的图像上都看不到鼠标光标 代码如下 procedure capturar pantalla nombre string Credits Based on