2015-03-13 47 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