2016-03-05 1 views
0

Я пытаюсь создать приложение WPF, которое снимает видео и скриншоты каждую секунду во время игры.C# WPF Тема, доступная из потока, отличного от

Код

public Form2(string url) 
    { 
     InitializeComponent(); 
     axWindowsMediaPlayer1.URL = url; 

     new Thread(delegate(){ 
      CheckFrame(); 
     }).Start(); 

    } 
    private void CheckFrame() 
    {   
     for (int i = 0; i < 100; i++) 
     { 
      Bitmap screenshot = new Bitmap(axWindowsMediaPlayer1.Bounds.Width, axWindowsMediaPlayer1.Bounds.Height); 
      Graphics g = Graphics.FromImage(screenshot); 
      g.CopyFromScreen(axWindowsMediaPlayer1.PointToScreen(
         new System.Drawing.Point()).X, 
        axWindowsMediaPlayer1.PointToScreen(
         new System.Drawing.Point()).Y, 0, 0, axWindowsMediaPlayer1.Bounds.Size); 
      pictureBox1.BackgroundImage = screenshot; 
      System.Threading.Thread.Sleep(1000); 
     } 
    } 

При использовании значений ху медиаплеере сам я получаю ошибку

Additional information: Cross-thread operation not valid: Control 'axWindowsMediaPlayer1' 
accessed from a thread other than the thread it was created on. 

При использовании 0 в X/значения Y так просто 0px и 0px с точки вида зрения, он прекрасно работает

+0

В WPF вы, вероятно, должны попытаться использовать объекты Task (TPL) и Dispatcher. С наилучшими пожеланиями, –

ответ

0

В этом случае вы можете использовать таймер:

Timer tm = new Timer(); 

public Form2(string url) 
{ 
    InitializeComponent(); 
    axWindowsMediaPlayer1.URL = url; 

    tm.Interval = 1000; 
    tm.Tick += tm_Tick; 
    tm.Start(); 
} 

int i = -1; 
void tm_Tick(object sender, EventArgs e) 
{ 
    if (++i < 100) 
    { 
     Bitmap screenshot = new Bitmap(axWindowsMediaPlayer1.Bounds.Width, axWindowsMediaPlayer1.Bounds.Height); 
     Graphics g = Graphics.FromImage(screenshot); 
     g.CopyFromScreen(axWindowsMediaPlayer1.PointToScreen(
        new System.Drawing.Point()).X, 
       axWindowsMediaPlayer1.PointToScreen(
        new System.Drawing.Point()).Y, 0, 0, axWindowsMediaPlayer1.Bounds.Size); 
     pictureBox1.BackgroundImage = screenshot; 
    } 
    else 
    { 
     i = -1; 
     tm.Stop(); 
    } 
} 

Примечание. Чтобы сделать снимок экрана с помощью вашего метода, на экране должно отображаться axWindowsMediaPlayer1.

 Смежные вопросы

  • Нет связанных вопросов^_^