使用截图程序VB.net预览桌面

使用截图程序VB.net预览桌面,vb.net,Vb.net,我只是想知道。如何调整代码 Dim Size As Rectangle Dim Capt As System.Drawing.Bitmap Dim Pic As Graphics Do While 1 Size = Form2.Bounds Capt = New System.Drawing.Bitmap(Size.Width, Size.Height, System.Drawing.Imaging.PixelFormat

我只是想知道。如何调整代码

        Dim Size As Rectangle
    Dim Capt As System.Drawing.Bitmap
    Dim Pic As Graphics

    Do While 1
        Size = Form2.Bounds
        Capt = New System.Drawing.Bitmap(Size.Width, Size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
        Pic = Graphics.FromImage(Capt)
        Pic.CopyFromScreen(Size.X, Size.Y, 0, 0, Size.Size, CopyPixelOperation.MergeCopy)
        PictureBox1.Image = Capt
    Loop
从窗体所看到的内容显示图片。 更清楚的理解是必要的


我有两种形式,一种是图片框,另一种是透明形式,我想让图片框显示第二种形式所看到的东西,它的透明部分可以是整个形式的边框和全部。然后继续将其保存到一个文件中,我认为我的代码会自动更新到屏幕上第二个表单所在的位置,并自动填充图片框,但显然不是这样。

这里有一个可能的解决方案,如果我正确理解您的意思,这将达到您想要的结果

如果您有任何问题,请随时提问:

Public Class Form2
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.BackColor = Color.Magenta
        Me.TransparencyKey = Color.Magenta
    End Sub
End Class

我希望您在单独的线程中运行此代码,因为如果窗体在窗体的类中,此循环将阻止窗体响应…我很愚蠢,但还没有愚蠢到忘记这一点。一切都很好,直到事实上我似乎无法让它更新到我拖动第二个表单的位置,这是我到目前为止唯一的问题。我没有冒犯的意思。只是有时候我们错过了一些小事情,这让我们以后最头疼:我知道你说的不是什么意思,这个问题一直困扰着我,我打赌这是一个我看不到的简单解决方案:/n不,同样的问题,它只显示框的起始位置,不会更新到屏幕上的第二个框,要么我做错了什么的,但我不知道。我的代码来自Form1.vb,请不要对跨线程调用大喊大叫;-;这实际上是一个跨线程问题。表单的控件只能从表单的创建线程更新,这就是我在示例中使用计时器的原因。如果要使用新线程,需要使用另一个子线程\u main包装refreshview子线程,该子线程将在新线程上运行,并且在该线程\u main内,需要在Form1的线程上调用refreshview。我不记得确切的语法,有Form SealPosikKy,稍后我会在电脑上写一个例子。唉,我担心这会成为一个问题:唯一的问题是我知道C++的基础知识,不知道如何将表单控件传递给VisualBasic上的子函数,我想我可以绕过它。哦,好吧。谢谢你抽出时间来。别担心,这没什么大不了的,对代表们做一个快速的调查,当我到电脑前,我会更新我的答案。你只需要额外的4行代码就可以了。@Jalomba好吧,我测试了你的代码,问题似乎不是跨线程操作。尽管无论如何都应该避免表单上的跨线程,但问题是您需要实例化form2并计算实例的边界。我会更新我的答案。
Imports System.Threading

Public Class Form1
    Private ScreenShot As Thread
    Dim F2 As Form2
    Private Sub Capt_Click(sender As Object, e As EventArgs) Handles Capt.Click
        CheckForIllegalCrossThreadCalls = False
        F2 = New Form2
        F2.Show()
        ScreenShot = New Thread(AddressOf RefreshView)
        ScreenShot.IsBackground = True
        ScreenShot.Start()
    End Sub

    Private Sub RefreshView()
        Dim Size As Rectangle
        Dim Capt As System.Drawing.Bitmap
        Dim Pic As Graphics
        Do While 1
            Size = F2.RectangleToScreen(F2.ClientRectangle)
            Capt = New System.Drawing.Bitmap(Size.Width, Size.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb)
            Pic = Graphics.FromImage(Capt)
            Dim boundsLeft = Size.X
            Dim boundsTop = Size.Y
            Pic.CopyFromScreen(boundsLeft, boundsTop, 0, 0, Size.Size, CopyPixelOperation.MergeCopy)
            pictureBox1.Image = Capt
        Loop
    End Sub
End Class