簡體   English   中英

使用Windows服務的屏幕截圖

[英]Screen capture using windows service

即使有很多關於此問題的問題,我也找不到合適的解決方案。 我正在創建Windows服務以捕獲屏幕(Windows 7)。 (我使用Windows應用程序嘗試過它,並且可以正常工作。)

當我要啟動該服務時,它說我無法啟動該服務。 當我檢查Windows日志時,它提到了以下錯誤。

Service cannot be started. System.ComponentModel.Win32Exception (0x80004005): The handle is invalid
   at System.Drawing.Graphics.CopyFromScreen(Int32 sourceX, Int32 sourceY, Int32 destinationX, Int32 destinationY, Size blockRegionSize, CopyPixelOperation copyPixelOperation)
   at ScreenCaptureService.ScreenCaptureService.TraceService() in d:\SourceControl\Test\Test\ScreenCapture\ScreenCaptureService\ScreenCaptureService.cs:line 63
   at ScreenCaptureService.ScreenCaptureService.OnStart(String[] args) in d:\SourceControl\Test\Test\ScreenCapture\ScreenCaptureService\ScreenCaptureService.cs:line 32
   at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

我的代碼如下:

public partial class ScreenCaptureService : ServiceBase
{

    private static Bitmap bmpScreenshot;
    private static Graphics gfxScreenshot;
    System.Timers.Timer timer = new System.Timers.Timer();
    public ScreenCaptureService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {

        TraceService();
        timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
        timer.Interval = 300000;          
        timer.Enabled = true;
    }

    protected override void OnStop()
    {
        timer.Enabled = false;
        TraceService();
    }

    private void TraceService()
    {
        string fileName = "D:\\Screen\\abc.png";
        bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);


        gfxScreenshot = Graphics.FromImage(bmpScreenshot);            
        gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);

        bmpScreenshot.Save(fileName, ImageFormat.Png);
    }

    private void OnElapsedTime(object source, ElapsedEventArgs e)
    {
        TraceService();
    }
}

我在這里想念的..

編輯:當我勾選allow service to interact with desktop它將在日志中顯示以下錯誤。

Service cannot be started. System.Runtime.InteropServices.ExternalException (0x80004005): A generic error occurred in GDI+.
   at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
   at ScreenCaptureService.ScreenCaptureService.TraceService() in d:\SourceControl\Test\Test\ScreenCapture\ScreenCaptureService\ScreenCaptureService.cs:line 66
   at ScreenCaptureService.ScreenCaptureService.OnStart(String[] args) in d:\SourceControl\Test\Test\ScreenCapture\ScreenCaptureService\ScreenCaptureService.cs:line 32
   at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

我解決了這里提到的問題,但隨后又遇到了另一個問題。 由於上述鏈接中提到的原因,它另存為黑色窗口。 所以最后我將應用程序更改為Windows窗體應用程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM