簡體   English   中英

C# 從 Windows 服務監控桌面屏幕

[英]C# Monitoring desktop screen from a Windows service

我剛剛編寫了記錄桌面屏幕截圖的 C# 代碼。它適用於 Winforms,但不適用於 Windows 服務。

我的代碼如下:

public partial class ScreenCapture : ServiceBase
{
        bool rec = false;

        Rectangle screenSize = Screen.PrimaryScreen.Bounds;

        UInt32 frameCount = 0;

        VideoFileWriter writer;

        int width = SystemInformation.VirtualScreen.Width;
        int height = SystemInformation.VirtualScreen.Height;

        AForge.Video.ScreenCaptureStream streamVideo;

        Stopwatch stopWatch = new Stopwatch();

        public ScreenCapture()
        {
            InitializeComponent();
            writer = new VideoFileWriter();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource("MySource", "MyLog");
            }
            eventLog1.Source = "MySource";
            this.CanHandleSessionChangeEvent = true;
        }

        protected override void OnSessionChange(SessionChangeDescription changeDescription)
        {
            string folderName = @"C:\LoginLog";
            if (changeDescription.Reason == SessionChangeReason.SessionLogon)
            {
                eventLog1.WriteEntry(changeDescription.SessionId + " User Logon");
                if (!Directory.Exists(folderName))
                {
                    Directory.CreateDirectory(folderName);
                }

                StartRec(folderName);
            }
            else if (changeDescription.Reason == SessionChangeReason.SessionLogoff)
            {
                eventLog1.WriteEntry(changeDescription.SessionId + " User Logoff");
                rec = false;
            }
            else if (changeDescription.Reason == SessionChangeReason.SessionLock)
            {
                eventLog1.WriteEntry(changeDescription.SessionId + " User Lock");
                rec = false;
            }
            else if (changeDescription.Reason == SessionChangeReason.SessionUnlock)
            {
                eventLog1.WriteEntry(changeDescription.SessionId + " User Unlock");
                if (!Directory.Exists(folderName))
                {
                    Directory.CreateDirectory(folderName);
                }

                StartRec(folderName);
            }
            base.OnSessionChange(changeDescription);
        }

        private void StartRec(string path)
        {
            if (rec == false)
            {
                rec = true;

                frameCount = 0;

                string time = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ssff");
                string compName = Environment.UserName;
                string fullName = path + "\\" + compName.ToUpper() + "_" + time;

                try
                {
                    writer.Open(
                        fullName + ".mp4",
                        width,
                        height,
                        10,
                        VideoCodec.MPEG4, 1000000);
                }
                catch (Exception ex)
                {
                    eventLog1.WriteEntry("Exception StartRec: " + ex.Message);
                }

                DoJob();
            }
        }

        private void DoJob()
        {
            try
            {
                Rectangle screenArea = Rectangle.Empty;
                foreach (System.Windows.Forms.Screen screen in
                    System.Windows.Forms.Screen.AllScreens)
                {
                    screenArea = Rectangle.Union(screenArea, screen.Bounds);
                }

                streamVideo = new ScreenCaptureStream(screenArea);

                streamVideo.NewFrame += new NewFrameEventHandler(video_NewFrame);

                streamVideo.Start();

                stopWatch.Start();
            }
            catch (Exception ex)
            {
                eventLog1.WriteEntry("Exception DoJob: " + ex.Message);
            }
        }

        private void video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            try
            {
                if (rec)
                {
                    frameCount++;
                    writer.WriteVideoFrame(eventArgs.Frame);
                }
                else
                {
                    stopWatch.Reset();
                    Thread.Sleep(500);
                    streamVideo.SignalToStop();
                    Thread.Sleep(500);
                    writer.Close();
                }
            }
            catch (Exception ex)
            {
                eventLog1.WriteEntry("Exception Video New Frame: " + ex.Message);
            }
        }
}

並且該服務可以保存一個.mp4文件,但無法打開它。我認為windows服務無法捕獲桌面屏幕。

有人可以幫我解決這個問題嗎?

提前致謝。

您需要設置在交互式帳戶下運行的windows服務,

為此,您需要轉到服務屬性,轉到登錄選項卡並使用您的 Windows 帳戶登錄。

在此處輸入圖片說明

暫無
暫無

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

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