2012-01-13 3 views
2

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

Так что мне это нужно, это минимизировать приложение, затем сделать снимок экрана, а затем снова открыть программу после ее снятия с экрана.

Извините за вопрос, но я новичок в VB и только кодировал его менее чем за день.

Dim screenImage As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height) 
    Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(screenImage) 
    g.CopyFromScreen(New Point(0, 0), New Point(0, 0), New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)) 


    Me.Hide() 
    screenImage.Save("C:\screenImage.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) 
    Dim tSpan As TimeSpan = TimeSpan.FromSeconds(System.DateTime.Now.Second) 
    Dim tSpan2 As TimeSpan = TimeSpan.FromSeconds(System.DateTime.Now.Second) 
    Do While Math.Abs(tSpan.Subtract(tSpan2).Seconds) < 2 
     tSpan2 = TimeSpan.FromSeconds(System.DateTime.Now.Second) 

    Loop 
    Me.Show() 

Любая помощь будет замечательной.

+0

Установите свойство непрозрачности формы на 99 и удалить вызов Hide(). Это на самом деле ошибка: –

ответ

3

Вы звоните Hideпосле вы сделали скриншот :)

Попробуйте это:

Dim screenImage As New Bitmap(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height) 
Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(screenImage) 

Me.Hide() 
Me.Application.DoEvents() ' <-- might not be necessary; try without it first. 

g.CopyFromScreen(New Point(0, 0), New Point(0, 0), New Size(My.Computer.Screen.Bounds.Width, My.Computer.Screen.Bounds.Height)) 

screenImage.Save("C:\screenImage.jpg", System.Drawing.Imaging.ImageFormat.Jpeg) 
Dim tSpan As TimeSpan = TimeSpan.FromSeconds(System.DateTime.Now.Second) 
Dim tSpan2 As TimeSpan = TimeSpan.FromSeconds(System.DateTime.Now.Second) 
Do While Math.Abs(tSpan.Subtract(tSpan2).Seconds) < 2 
    tSpan2 = TimeSpan.FromSeconds(System.DateTime.Now.Second) 

Loop 
Me.Show() 
+0

да, она все еще показывает приложение на скриншоте. :( – Alex

+0

@Alex отредактировал мой ответ –

+0

Вы УДИВИТЕЛЬНО! Большое вам спасибо !!!!!!!!!!!!!!!!!!!!!!!!! – Alex

0

Попробуйте положить в коде ниже после того, как вас Me.Hide()

Application.DoEvents() 
System.Threading.Thread.Sleep(100) 

Спать 100 должно быть достаточно, но если в окне все еще частично есть попытка добавить больше времени.

Edit:

Глядя на вас код, который я не понял, вы пытались поставить в засаде. Thread.Sleep будет ждать вас. Просто введите время в миллисекундах.

Вариант 2:

Используйте BackgroundWorker, чтобы сделать снимок экрана. Просто поставьте Me.Hide перед тем, как начать работника фона, захватить экран в DoWork и Me.Show в RunWorkerCompleted. Также добавьте System.Threading.Thread.Sleep(100) внутри DoWork перед скриншотом.

+0

То же самое, что программа все еще находится на картинке. – Alex

+0

Кажется, программа делает снимок, пока программа вставлена, а не когда ее минимизация. – Alex

+0

Другим вариантом будет установка захвата экрана внутри рабочего фона. Помещая его в другой поток, окно исчезнет. http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx – norlando

0

Я пробовал это, когда нажимается кнопка. скриншот попадает в фотошоп под названием picDisplay.

Me.Hide() 
    Dim bounds As Rectangle 
    Dim screenshot As System.Drawing.Bitmap 
    Dim graph As Graphics 
    bounds = Screen.PrimaryScreen.Bounds 
    screenshot = New System.Drawing.Bitmap(bounds.Width, bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb) 
    graph = Graphics.FromImage(screenshot) 
    graph.CopyFromScreen(bounds.X, bounds.Y, 0, 0, bounds.Size, CopyPixelOperation.SourceCopy) 
    picDisplay.Image = screenshot 
    Me.Show() 
    'this takes a screenshot 

и нажав эту кнопку сохраняет его:

Dim savefiledialog1 As New SaveFileDialog 
    savefiledialog1.Title = "Save File" 
    savefiledialog1.FileName = "*.bmp" 
    savefiledialog1.Filter = "Bitmap |*.bmp" 
    If savefiledialog1.ShowDialog() = DialogResult.OK Then 
     picDisplay.Image.Save(savefiledialog1.FileName, System.Drawing.Imaging.ImageFormat.Bmp) 
    End If 
    'and this saves the screenshot