Tempo
Tempo

Reputation: 211

Issue with screen capture

I have a button on which a click and it takes a screenshot which i display in my Picture Box. I dont face issue with this code:

private void btnScreenShot_Click(object sender, EventArgs e)
        {

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

However when i loop the entire Form freezes and i cannot click on anything:

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

How do i fix this problem?

Upvotes: 0

Views: 184

Answers (3)

Lev
Lev

Reputation: 3924

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();
            }
        }

Upvotes: 2

Shai
Shai

Reputation: 25619

That's because your while() is infinite. What makes flag change from capture to capture?

In case you want to infinitely capture the screen - never use the main thread for such things, as it will cause it to hang and prevent your application from updating the UI.

Use the BackgroundWorker class for things like that, you can use this example.

Upvotes: 2

MUS
MUS

Reputation: 1450

Try Application.DoEvents in loop. I think this can help you...

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

Upvotes: 0

Related Questions