Problem z rejestracją ekranu za pomocą klasy Microsoft.Expression.Encoder.ScreenCapture

0

Witam,

Mam następujący problem. Napisałem program, którego zadaniem jest rejestracja obrazu ekranu. W tym celu skorzystałem z klasy Microsoft.Expression.Encoder.ScreenCapture. Dla pierwszego ekranu (laptop) wszystko działa poprawnie. Tworzy się plik *.xesc z zarejestrowanym obrazem. Natomiast dla drugiego ekranu (dołączony monitor) obraz co prawda zostaje zarejestrowany, jednak po otwarciu pliku okazuje się, że nagrany obraz ekranu jest pomniejszony i zajmuje tylko część pełnego pola obrazu. Czy ktoś wie co można zrobić, żeby w tym przypadku obraz ekranu również zajął cały obszar obrazu video? Poniżej wklejam metody napisane przeze mnie dla celów rejestracji obrazu:

        public bool StartRecording
        {
            get
            {
                return startrecording;
            }
            set
            {

                if (RecordingInOperation)
                {
                    StopRecording = true;
                }

                startrecording = value;

                if (Directory.Exists(DirectoryPath.Substring(0, DirectoryPath.IndexOf("\\") + 1)) && value && !this.StopRecording)
                {
                    try
                    {
                        

                        job = new ScreenCaptureJob();

                        Rectangle Resolution = Screen.AllScreens[ScreenID].Bounds;

                        int offset = 0;

                        for (int i = 0; i < ScreenID; i++)
                        {
                            offset += Screen.AllScreens[i].Bounds.Width;
                        }


                        job.ScreenCaptureVideoProfile.Quality = this.Quality;
                        job.ScreenCaptureVideoProfile.FrameRate = this.FrameRate;
                        ConstantBitrate b = new ConstantBitrate(this.BitRate);
                        job.ScreenCaptureVideoProfile.Bitrate = b;
                     
                        
                        // Sets the top right coordinates of the capture rectangle
                        int topRightX = offset;
                        int topRightY = 0;
                        // Sets the bottom left coordinates of the capture rectangle
                        int BottomLeftX = topRightX + Resolution.Width;
                        int BottomLeftY = topRightY + Resolution.Height;

                        //job.CaptureRectangle = new Rectangle(topRightX, topRightY, BottomLeftX, BottomLeftY);
                        job.CaptureRectangle = new Rectangle(topRightX, topRightY, BottomLeftX, BottomLeftY);

                        job.ScreenCaptureVideoProfile.AutoFit = true;
                
                        job.ShowFlashingBoundary = false;

                        

                        job.OutputScreenCaptureFileName = DirectoryPath + @"\" + FileNamePrefix + "_" + DateTime.Now.Year.ToString("0000") + DateTime.Now.Month.ToString("00") + DateTime.Now.Day.ToString("00") + "_" + DateTime.Now.Hour.ToString("00") + DateTime.Now.Minute.ToString("00") + DateTime.Now.Second.ToString("00") + ".xesc";
                        job.Start();
                       
                        startTim = DateTime.Now;
                        recording = true;
                        try
                        {
                            RecordingStatusChanged();
                        }
                        catch (Exception)
                        {

                        }

                    }
                    catch (Exception)
                    {
                        throw;
                    }
                    this.StartRecording = false;
                }
            }
        }

        
        public bool StopRecording
        {
            get
            {
                return stoprecording;
            }
            set
            {
                stoprecording = value;

                if (value && !this.StartRecording)
                {
                    try
                    {
                        recording = false;
                        job.Stop();
                        try
                        {
                            RecordingStatusChanged();
                        }
                        catch (Exception)
                        {

                        }
                    }
                    catch(Exception)
                    {
                        throw;
                    }
                    this.StopRecording = false;
                }
            }
        }
0

Nigdy nie korzystałem z tej biblioteki dlatego moja odpowiedź może być całkowicie błędna, ale wytłumacz co ten kawałek kodu robi. Wrzucasz sobie do klasy tylko Rectangle roździelczość ekranu określonego przez zmienną ScreenID. Następnie do zmiennej offset dodajesz szerokość wszystkich ekranów, który później wykorzystujesz do określenie położenia obrazu. Czyli wartość w offset będzie miała szerokość ekranu z laptopa + ekranu monitora, a w Rectangle masz wartości tylko z ekranu po ScreenID. Powtarzam mogę się mylić nie analizowałem kodu w IDE, nie znam biblioteki to strzał taki pierwszy na sucho, ale może pomoże.

     Rectangle Resolution = Screen.AllScreens[ScreenID].Bounds;

      int offset = 0;

       for (int i = 0; i < ScreenID; i++)
       {
              offset += Screen.AllScreens[i].Bounds.Width;
       }

       int topRightX = offset;
0

Przyjąłem numerację od zera. W związku z tym dla ScreenID=0 offset=0 (czyli lewa krawędź ekranu laptopa). Dla ScreenID=1 offset będzie równy szerokości ekranu laptopa, a zatem lewa krawędź nagrywanego ekranu pokryje się z lewą krawędzią dodatkowego monitora. Pod tym kątem program na pewno działa poprawnie, bo rzeczywiście nagrywa odpowiednie ekrany dla odpowiednich wartości ScreenID. Problem polega na tym, że gdy otwieram film z nagranym prawym ekranem, to zajmuje on jedynie część obrazu video Przechwytywanie.JPG

1 użytkowników online, w tym zalogowanych: 0, gości: 1