Delphi在全局异常中的屏幕截图

2024-01-10

我正在开发一个组件,使用德尔福2006,该组件检索系统信息并写入文件。 要求是我必须在组件中合并一个全局异常处理程序,因此当异常发生时它将被捕获并向用户显示我的自定义消息。

  procedure Tmy.GlobalExceptionHandlerThis(Sender : TObject; E : Exception );
  begin
    //catch the exception and show the message
      TakeScreenShotAndSaveInapplicationFolder;
      MessageDlg('Exception has Occured  , Detail  '+E.Message,mtError,[mbOK],0);
  end;

这工作正常,但根据要求,我必须捕获错误屏幕截图(这是为了直观地找到弹出异常的表单)

所以我这样做了,并从以下位置获取屏幕截图代码delphigeist.com http://www.delphigeist.com/2009/09/take-screenshot.html:

procedure TakeScreenShotAndSaveInapplicationFolder;
var
  thisBitmap: TBitmap;
  sDate : string;
begin
  DateSeparator :='_';
  TimeSeparator:='_';
  sDate :=DateTimeToStr(now);
  thisBitmap := TBitmap.Create;
  ScreenshotArea(thisBitmap, Screen.DesktopRect, True);
  thisBitmap.SaveToFile(ExtractFilePath(Application.ExeName)+sDate+'.jpg');
  FreeAndNil(thisBitmap);
end;

Problem:

当异常发生时,我也想截取消息的屏幕截图,但使用我的代码会发生这种情况

谁能告诉我怎样才能得到这样的屏幕截图? 这是沿着表格获取消息

MessageDlg('Exception has Occured, Detail ' + E.Message,mtError,[mbOK],0);是模态的,所以在消息之后我无法拍摄屏幕截图。在我也不能之前, 那么什么时候可以在出现异常信息时截屏呢?

procedure Tmy.GlobalExceptionHandlerThis(Sender : TObject; E : Exception );
begin
  //catch the exception and show the message
  TakeScreenShotAndSaveInapplicationFolder;
  MessageDlg('Exception has Occured  , Detail  '+E.Message,mtError,[mbOK],0);
  TakeScreenShotAndSaveInapplicationFolder;
end;

Modify 这个消息框 https://stackoverflow.com/a/9642293/757830(一个包装器Windows.MessageBox), 如下:

{ TAwMessageBox }

type
  TAwMessageBox = class(TObject)
  private
    FCaption: String;
    FFlags: Cardinal;
    FHookProc: TFarProc;
    FText: String;
    FWndHook: HHOOK;
    function Execute: Integer;
    procedure HookProc(var Message: THookMessage);
  end;

function TAwMessageBox.Execute: Integer;
begin
  try
    try
      FHookProc := MakeHookInstance(HookProc);
      FWndHook := SetWindowsHookEx(WH_CALLWNDPROCRET, FHookProc, 0,
        GetCurrentThreadID);
      Result := Application.MessageBox(PChar(FText), PChar(FCaption), FFlags);
    finally
      if FWndHook <> 0 then
        UnhookWindowsHookEx(FWndHook);
      if FHookProc <> nil then
        FreeHookInstance(FHookProc);
    end;
  except
    Result := 0;
  end;
end;

procedure TAwMessageBox.HookProc(var Message: THookMessage);
var
  Data: PCWPRetStruct;
  Title: array[0..255] of Char;
begin
  with Message do
    if nCode < 0 then
      Result := CallNextHookEx(FWndHook, nCode, wParam, lParam)
    else
      Result := 0;
  if Message.nCode = HC_ACTION then
  begin
    Data := PCWPRetStruct(Message.lParam);
    if (Data.message = WM_ACTIVATE) and (LoWord(Data.wParam) = WA_INACTIVE) then
    begin
      ZeroMemory(@Title, SizeOf(Title));
      GetWindowText(Data.hwnd, @Title, SizeOf(Title));
      if String(Title) = FCaption then
      begin
        TakeScreenShotAndSaveInapplicationFolder;
        UnhookWindowsHookEx(FWndHook);
        FWndHook := 0;
        FreeHookInstance(FHookProc);
        FHookProc := nil;
      end;
    end;
  end;
end;

function MsgBox(const Text: String; Flags: Cardinal;
  const Caption: String): Integer;
begin
  with TAwMessageBox.Create do
  try
    FCaption := Caption;
    FFlags := Flags;
    FText := Text;
    Result := Execute;
  finally
    Free;
  end;
end;

测试代码及截图:

procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception);
begin
  MsgBox('Exception has occured. Details:'#13#10#13#10 + E.Message,
    MB_OK or MB_ICONERROR, 'Error');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  raise Exception.Create('Test exception');
end;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi在全局异常中的屏幕截图 的相关文章

  • 如何单独捕获这些异常?

    我正在编写一个与 Quickbooks 交互的 Python 程序 连接到 Quickbooks 时 根据问题的不同 我可能会遇到以下两个常见异常之一 pywintypes com error 2147352567 Exception oc
  • 如何向标准集合编辑器添加图标?

    我有一个自定义控件 它利用TCollection and TCollectionItem 在集合编辑器中 我想向每个列表项添加图标 该列表项由内部TImageList 在其父组件内 集合项本身代表图标 我想在这个编辑器中显示相应的图标 如何
  • 从 ADF Faces JSF 1.2 中的托管 bean 构造函数导航

    是否可以从托管 bean 的构造函数导航到另一个页面 视图 如果发生任何异常 我希望进行此重定向 我尝试了很多方法 Try 1 getFacesContext responseComplete getFacesContext getAppl
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • 在Delphi 7中,为什么我可以给const赋值?

    我将一些 Delphi 代码从一个项目复制到另一个项目 发现它在新项目中无法编译 但在旧项目中可以编译 代码看起来像这样 procedure TForm1 CalculateGP const Price money 0 begin Pric
  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • 如何使 StringGrid 的列适合网格的宽度?

    我已经寻找解决方案很长时间了 但没有任何运气 有谁知道一个简单的方法来做到这一点 例如 我想拉伸网格的第二列以适应网格的宽度 Use the ColWidths财产 像这样 with StringGrid1 do ColWidths 1 C
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 如何比较枚举类型集

    从某个时刻开始 我厌倦了编写设定条件 and or 因为对于更多的条件或更长的变量名 重新编写会变得笨拙且烦人 所以我开始写助手这样我就可以写ASet ContainsOne ceValue1 ceValue2 代替 ceValue1 in
  • Delphi - 如果没有创建类,为什么这个函数可以工作?

    考虑这个类 unit Unit2 interface type TTeste class private texto string public function soma a b integer string end implementa
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • MongoDB:javascript执行失败:无法在 src/mongo/shell/collection.js 保存 DBQuery 对象

    在 MongoDb 中 当我尝试修改集合中的现有文档时 它会生成以下异常 javascript execution failed can t save a DBQuery object at src mongo shell collecti
  • 尝试抓住最后的问题

    在 Try Catch Final 块中 无论发生什么情况 finally 块总是执行 还是仅当 catch 块不返回错误时才执行 我的印象是 只有当 catch 块没有错误地通过时 finally 块才会执行 如果 catch 块因错误而
  • Delphi XE7 Android 全屏(隐藏软键)

    如何在XE7中全屏显示 隐藏顶部 标题 和底部 软键 工具栏 在 XE6 中 我可以通过在应用程序部分写入来调整 AndroidManifest 以使我的应用程序全屏显示并且没有操作栏 android theme android style
  • 在 Rails 项目中保存自定义异常定义的常规位置是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 当创建自己的自定义异常时 例如 class ThingExploded lt StandardError end class ThingIsMi

随机推荐

  • 使用D语言开发应用程序

    对于那些使用 D 开发过应用程序的人来说 您使用哪些库来构建您的应用程序 那些图书馆有很好的记录吗 你用过探戈吗 您觉得 D 准备好构建大型应用程序了吗 你用的是哪个IDE 也许是下降 请注意 任何 C 库都可以与 D 一起使用 因为 D
  • hashmap 出现并发修改异常的问题

    我在使用地图并执行一些删除操作时收到以下错误 如何避免这种情况 Caused by java util ConcurrentModificationException at java util HashMap HashIterator ne
  • 注销清除 SharedPreferences

    我有一个可以保存的登录页面username and password to SharedPreferences 我还有一个Activity包含注销按钮的类 我想清除SharedPreferences当我单击注销按钮时 问题是我不明白Shar
  • 从 iOS/Xcode 项目中卸载/删除 Carthage?

    这是一个链接Carthage https github com Carthage Carthage https github com Carthage Carthage 它还在项目文件中添加了一些更改 因此我可以简单地删除额外的文件 文件夹
  • 获取二维数组中高于特定值的局部最大值的坐标

    from PIL import Image import numpy as np from scipy ndimage filters import maximum filter import pylab the picture 256 2
  • 如何在 Facebook Graph API 中获取 Instagram 照片帖子的点赞?

    我正在开发一个应用程序来处理
  • 使用 bitbake 进行分布式编译

    您知道如何使用分布式 bitbake 编译构建 oe 项目吗 我考虑过 distcc export PATH distcc bin PATH make jn CC linux gcc make 将从我的路径调用 linux gcc 该路径指
  • Matplotlib:--如何显示刻度上的所有数字? [复制]

    这个问题在这里已经有答案了 可能的重复 如何消除 matplotlib 轴的相对偏移 https stackoverflow com questions 11855363 how to remove relative shift in ma
  • 在 xyplot 下方绘制具有相同 x 轴的条形图?

    我试图在彼此下方绘制不同类型的图 线图和条形图 它们都具有相同的轴 c1 lt ggplot data aes date TotalMutObs stat smooth se FALSE geom point opts axis title
  • 如何在静态谷歌地图上添加高分辨率自定义标记

    我正在使用 Google 静态地图 文档在这里 http code google com apis maps documentation staticmaps 来显示商店的位置 我使用自定义标记而不是默认标记 然而 此标记图像在 iPhon
  • 环回 - 包括关系的计算属性

    我有一个环回应用程序 我希望能够在 API 调用中包含关系的计算属性 例如 假设我有一个apartment模型和一个address模型 这address有属性city and state 我想向公寓模型打一个电话 并将城市和州作为相关信息中
  • Materialize.css 从输入元素中删除样式

    我想让 Materialize css 卡在双击时可编辑 为此 我将输入放在卡片 div 中 而不是 p 中 div row each cards div col m4 s12 div card teal div card content
  • 用于打印 1-99 奇数的最有效代码 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 任务是将 1 到 99 的奇数打印在不同的行上 Codeeval 认为此代码部分正确 100 中的 98 已编辑 liszt i
  • 修改Http状态代码文本

    Question 如何修改状态代码文本 描述 标题 Example 例如 我想改变200 Ok to 200 My Custom Text 描述 我想创建一个带有自定义状态代码 未保留 431 的 HTTP 响应 我想修改它的文本 200
  • 从输入标签获取名称和值

    在你说 哦不 不再这样 之前 我先陈述一下我的情况 我正在解析 HTML 输出的一部分 我唯一感兴趣的是name and value每个的属性
  • 删除 androidx 首选项上的空白图标空间

    我刚刚将我的项目迁移到使用androidx图书馆 新的首选项 设置屏幕现在显示空的图标空间 如图所示here https developer android com guide topics ui settings organize you
  • 根据用户输入动态创建表

    我目前正在尝试使用 JS 和 HTML 动态创建一个表 但目前它似乎无法从用户输入中检索值 我做错了什么 提前致谢
  • 如何根据 XSD 文件验证 XML 文件?

    我正在生成一些 xml 文件 这些文件需要符合给我的 xsd 文件 我应该如何验证它们是否符合要求 Java 运行时库支持验证 上次我检查的是 Apache Xerces 解析器 你可能应该使用javax xml validation Va
  • Swift 将数组作为参数传递错误

    我刚刚开始使用 Swift 有人可以向我解释一下为什么我可以将数组作为参数传递 byRoundingCorners UIBezierPath roundedRect self bounds byRoundingCorners topLeft
  • Delphi在全局异常中的屏幕截图

    我正在开发一个组件 使用德尔福2006 该组件检索系统信息并写入文件 要求是我必须在组件中合并一个全局异常处理程序 因此当异常发生时它将被捕获并向用户显示我的自定义消息 procedure Tmy GlobalExceptionHandle