使用纯net技术实现抓屏(包含连续抓图和鼠标的问题的解决方法

之前转载了一篇关于api抓屏的实例,本次载的是老外Jason Hensley写的抓屏,实现方式与上次不同,可以方便大家对比

''开发平台 VB.NET 2005 <Beta 2>

''Description: A basic example of using the new built-in Sub in the
'2.0 version of the dotNetFramework to capture the screen,or portion
'of the screen and putting the image in a pictureBox. Then you have
'the option of saving the pictureBox image to a JPEG file. This example
'just uses the basic Sourcecopy raster on the screenshot. There
'are many raster-operations you can choose from.

''Update: Reworked the code to be compatible for VB.NET <Beta 2>. I
'also added a feature to hide the program when the screenshot is being
'taken.
'代码如下:
Public Class frmMain

Private Sub btncopy_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles btncopy.Click

'Create the bitmap and graphics objects.
Dim b As Bitmap = New Bitmap(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height)
Dim g As Graphics = Graphics.FromImage(b)

Dim s As Size = New Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height)

'See whether or not to hide the program before taking the
'screenshot.
If chkHide.Checked Then

Me.Hide()
'
'This is a short,sweet,and simple timeout code to pause
'for a specified amount of seconds. On my computer,1 sec
'is more than enough time for my app to be out of the way
'to take the screenshot to keep it from capturing the app
'with it.
Dim t As DateTime = Now.AddSeconds(1)
'
Do : Application.DoEvents()
Loop Until Now.Second >= t.Second
'
'copy the image from the screen. You can customize the size
'and postions to take the screenshot from.
g.copyFromScreen(0,s,copyPixelOperation.sourcecopy)
'
'Show the app again after the screenshot has been taken.
Me.Show()

'Clear this variable from memory.
t = nothing

Else

'copy the image from the screen. You can customize the size
'and postions to take the screenshot from.
g.copyFromScreen(0,copyPixelOperation.sourcecopy)

End If

'Load the copied image to the pictureBox control.
pic.Image = b

'Clean up alittle.
g.dispose()
b = nothing

End Sub

Private Sub btnSave_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles btnSave.Click

Dim saveDlg As SaveFileDialog = New SaveFileDialog
Dim dlgResult As DialogResult = New DialogResult

'Set the filter to JPEG files only.
saveDlg.Filter = "JPEG Files (*.jpg)|*.jpg"
saveDlg.Title = "Select the file to save the image too."

dlgResult = saveDlg.ShowDialog

If dlgResult = Windows.Forms.DialogResult.OK Then

'Save the image contained in the pictureBox.
pic.Image.Save(saveDlg.FileName)

End If

End Sub

End Class


我的补充:

1)如果想连续抓屏,就必须将下面的定义部分改为全局变量,以防止反复定义新对象而导致系统崩溃

Dim b As Bitmap= New Bitmap(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height)
Dim g As Graphics = Graphics.FromImage(b)

Dim s As Size = New Size(Screen.PrimaryScreen.WorkingArea.Width,Screen.PrimaryScreen.WorkingArea.Height)

2)抓鼠标的问题,必须获取鼠标位置,然后绘制鼠标到图像

g.copyFromScreen(SecScreen_x,SecScreen_y,d_x,d_y,copy_size,copyPixelOperation.sourcecopy) '添加鼠标位置 Cursor.Current.Draw(g,New Rectangle(Cursor.Position,Cursor.Current.Size))

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...