我写了个程序,用于在服务器上每天截一次屏幕然后自动给我发邮件,这样方便我了解服务器上的情况,可是截的图有问题,如果我远程直接在服务器上操作,不离开服务器画面,是可以截到图,我一旦退出3389远程,程序隔一段时间截的图就会成黑屏,这应该怎么解决?

解决方案 »

  1.   

    以下是我截图部分的代码:
    procedure snapscreen(a,b,c,d:Integer);
    var
      bmpscreen:Tbitmap;
      jpegscreen:Tjpegimage;
      FullscreenCanvas:TCanvas;
      dc:HDC;
      sourceRect, destRect: TRect;
    begin
      try
      dc:=getdc(0);
      fullscreencanvas:=Tcanvas.Create;
      fullscreencanvas.Handle:=dc;
      bmpscreen:=Tbitmap.create;
      bmpscreen.Width :=c-a;
      bmpscreen.Height :=d-b;
      sourcerect:=rect(0,0,c-a ,d-b );
      destrect:= rect(a,b,c,d);
      bmpscreen.Canvas.CopyRect(sourcerect,fullscreenCanvas,destrect);
      jpegscreen:=Tjpegimage.Create ;
      jpegscreen.Assign (bmpscreen);
      jpegscreen.CompressionQuality:=100;
      jpegscreen.SaveToFile(ExtractFilePath(ParamStr(0))+'tmp.jpg');
      FullscreenCanvas.Free;
      bmpscreen.Free;
      jpegscreen.Free ;
      ReleaseDC(0, DC);
      except
      end;
    end;以下是调用:
    SnapScreen(0,0,Screen.Width,Screen.Height);我的程序是在远程的服务器上运行的,我用3389远程控制,如果我把以上代码放在一个BUTTON里截图是没问题的。可我把这些代码放在一个Timer中,这个Timer10分钟运行一次,这10分钟内,如果我在远程服务器上连接着,是可以正常运行,一旦我关了3389远程,截到的图就是黑的,很是郁闷。PS:服务器没接显示器
      

  2.   

    桌面->右鍵->屬性->屏幕保護->(無)->確定
    桌面->右鍵->屬性->屏幕保護->電源->關閉硬盤及系統待機->從不->確定。OK
      

  3.   

    是的,没错,如果直接在远程服务器上一直进行任何操作,就是保持终端连接的话,那个10分钟截一次图的Timer会正常截到图,一旦退出3389远程终端,截到的图就是黑的
      

  4.   

    这应该和PC有没有连接显示器是有关系的,getdc返回的是一个设备的句柄,如果你的主机上面没有连接任务显示设备的话,这个返回的结果应该是0,你可以测试一下在你截图的timer里面把getdc(0)的结果写入log里面就可以验证。另外你也可以把Screen.Width,Screen.Height的值记录下来,在没有显示设备的情况它们的值不知道会是怎么样的。
      

  5.   

    uses   Clipbrd; procedure   TForm1.Timer1Timer(Sender:   TObject); 
    begin 
        keybd_event(VK_SNAPSHOT,   0,   0,   0); 
        keybd_event(VK_SNAPSHOT,   0,   KEYEVENTF_KEYUP,   0); 
        if   not   ClipBoard.HasFormat(CF_BITMAP)   then   Exit; 
        Image1.Picture.Bitmap.LoadFromClipboardFormat(CF_BITMAP,ClipBoard.GetAsHandle(CF_BITMAP),   0); 
        image1.Picture.SaveToFile('C:\ABC.bmp');//然后你将这个文件转成jpg,文件小更方便发邮件传输。
    end; 发邮件的代码不再给出。添加附件的方法是用:
    TIdAttachment.Create(IdMessage1.MessageParts,'c:\abc.jpg');//假如你已经把abc.bmp转成ABC.jpg了希望你能加分后再结贴,为了你这点分我写了半天。希望能满足你的要求!