Проблема с захватом экрана - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть кнопка, по которой можно щелкнуть, и он делает снимок экрана, который я отображаю в моем Picture Box.У меня нет проблем с этим кодом:

private void btnScreenShot_Click(object sender, EventArgs e)
        {

            btnSave.Visible = true;
            sendto_bmpbox.Image = CaptureScreen();
        }

Однако, когда я зацикливаюсь, вся форма замирает и я не могу ничего щелкнуть:

private void btnScreenShot_Click(object sender, EventArgs e)
        {
            // Freezes here
            btnSave.Visible = true;
            while(flag == 0)
            {
                 sendto_bmpbox.Image = CaptureScreen();
            }
        }

Как я могу решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012
private void button1_Click(object sender, EventArgs e)
        {
            btnSave.Visible = true;

            Thread thread = new Thread(new ThreadStart(threadWork));
            thread.Start();
        }

        int flag = 0;

        private void threadWork()
        {
            while (flag == 0)
            {
                UpdateImage();
            }
        }

        private void UpdateImage()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(UpdateImage);
            }
            else
            {
                sendto_bmpbox.Image = CaptureScreen();
            }
        }
2 голосов
/ 21 февраля 2012

Это потому, что ваш while() бесконечен. Что заставляет flag переходить от захвата к захвату?

В случае, если вы хотите бесконечно захватывать экран - никогда не используйте основной поток для таких вещей, так как это приведет к зависанию и запрету обновлению интерфейса вашего приложения.

Используйте класс BackgroundWorker для подобных вещей, вы можете использовать этот пример.

0 голосов
/ 21 февраля 2012

Попробуйте Application.DoEvents в цикле. Я думаю, что это может помочь вам ...

private void btnScreenShot_Click(object sender, EventArgs e)
        {
            // Freezes here
            btnSave.Visible = true;
            while(flag == 0)
            {
                 Application.DoEvents();
                 sendto_bmpbox.Image = CaptureScreen();
            }
        }
...