目的:当软件出现了异常时,用户描述得不是很清楚,想让主程序抓取所有的异常整个屏幕,保存成图片文件,这样方便查找异常。用什么方法能把在程序弹出异常框时,就把整个屏幕图面抓下来?

解决方案 »

  1.   

    用键盘上的这个键:Print Screen SysRq 
    就抓下来了,然后粘贴上就行了
      

  2.   

    procedure GetScreen(FileName: string; Colors: TPixelFormat = pf8bit);
    { 获取屏幕保存为文件; 不捕捉鼠标; 颜色数默认为 256 色 }
    var
      Bmp: TBitmap;
      DC: HDC;
      Canvas: TCanvas;
      R: TRect;
    begin
      Bmp := TBitmap.Create; 
      Canvas := TCanvas.Create; 
      DC := GetWindowDC(0);
      try
        Canvas.Handle := DC;
        R := Rect(0, 0, Screen.Width, Screen.Height);
        Bmp.Width := R.Right;
        Bmp.Height := R.Bottom;
        Bmp.Canvas.CopyRect(R, Canvas, R);
      finally
        ReleaseDC(0, DC);
      end;
      Canvas.Handle := 0;
      Canvas.Free;
      Bmp.PixelFormat := Colors; 
      Bmp.SaveToFile(FileName);
      Bmp.Free;
    end;
      

  3.   

    异常处理里面写截屏函数~
    ps:
    我c版的,路过,灌水~
      

  4.   

    关键在于,异常窗口弹出来,必须点击OK确定按钮后,程序才会执行下面的代码。
    如果把异常抓住,那么就不会弹出窗体。
    例如 执行下面代码时
      strtoint('except')
    程序会跳出异常框,让你点击OK
    如何写代码把屏幕抓下来。
    如果在主程序异常写代码。那么异常框就不会弹出来。
     
      

  5.   

    如:
    try
    .......
    except
    //////抓屏代码
    end;
      

  6.   

    为什么要拍照呢,拍照无非是为了查看异常发生的情况,可是只要你俘获异常了,里面就有该异常的相关信息阿。
    就算你能抓取屏幕,也不过是一个messagebox封装了的一个窗口,里面的内容你完全可以得到阿。
      

  7.   

    写一个Application.OnException处理过程,在里面把异常的消息保存到一个日志文件就可以了。
    如果你非要拷屏,可以这样:
    // 启动或者恢复一个拷屏线程,在里面检测顶层窗口是否是异常对话框,是则拷屏
    Raise;
    // 休眠或者终止线程
    注意这种方法对于严重错误弹出的系统模态对话框是无效的。