2015-03-13 45 views
1

我只是想知道。我该如何调整我的代码预览桌面与截图程序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.Format24bppRgb) 
     Pic = Graphics.FromImage(Capt) 
     Pic.CopyFromScreen(Size.X, Size.Y, 0, 0, Size.Size, CopyPixelOperation.MergeCopy) 
     PictureBox1.Image = Capt 
    Loop 

要从表单看到的图片显示。 一个更清晰的理解是 http://i.stack.imgur.com/euJmM.png

我有两种形式,一种具有图片框,另一种是透明的形式,我想在图片框中显示的是第二种形式所看到的,通过它的透明部分(灿只是整个表单边界和所有)。然后继续将它保存到一个文件中,我认为我的代码会自动更新到第二个窗体已经在屏幕上显示的位置,并自动填充图片框,但显然不是。

+1

我希望你是运行在一个单独的线程的代码,因为这个循环会阻止你的形式从响应如果它在形式的类... – Banana 2015-03-13 10:44:39

+0

我很笨,但不够愚蠢,忘记了。一切工作正常,直到事实上我似乎无法让它更新到我拖到第二个表单,这是我迄今为止唯一的问题。 – Jalomba 2015-03-13 10:50:20

+0

我的意思不是冒犯。它只是有时候我们错过的小事情导致我们最头痛的后来:) – Banana 2015-03-13 10:52:00

回答

0

这是您的一个可能的解决方案,如果我正确地理解了您的话,这会达到您想要的效果。

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

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 
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 
+0

不是,同样的问题,它只显示盒子的开始位置,不会更新以跟随屏幕上的第二个盒子,要么我做错了什么,但我不知道。 http://pastebin.com/CFnX68AC是我从Form1.vb的代码请不要大叫有关跨线程调用; - ; http://pastebin.com/6iiNCaaJ is form2 – Jalomba 2015-03-14 04:59:13

+0

这实际上是一个跨线程问题。窗体的控件只应该从窗体的创建线程更新,这就是为什么我在我的例子中使用了一个计时器。如果你想使用一个新线程,你需要用另一个子线程'thread_main()'包装你的'refreshview()'子线程,这个子线程将运行在新线程上,在这个'thread_main()'内部需要调用'refreshview ()'在Form1的线程上。我不记得确切的语法,用'Form1.BeginInvoke()'做了一些事情,当我到达一台计算机时,我会写一个例子。 – Banana 2015-03-14 08:46:46

+0

啊该死的,我怕这会成为一个问题:/唯一的问题是我知道C++的基本知识,不知道如何将窗体控件传递给Visual Basic上的子函数,并认为我可以绕过它。好吧。感谢您抽出时间。 – Jalomba 2015-03-14 10:03:58