none
擷取Form的畫面 RRS feed

  • 問題

  • 如題!我在站內搜尋到的資訊為

     

    http://tlcheng.twbbs.org/TLCheng/Net/NetList.aspx?Action=Function&Module=25&Function=202

    程式碼區塊

    ' 擷取表單畫面,Windows 內建熱鍵:Alt+PrintScreen
    Dim vLocation As Point = New Point(0, 0)
    Dim hWnd As IntPtr = MyFindWindow(, TextBox1.Text)
    Dim vSize As Size = GetWindowSize(hWnd)
    PictureBox1.Image = GetScreenShot(hWnd, vLocation, vSize)

     

     

    這應該是把擷取到的畫面放到PictureBox1.Image中吧?

    最後一行還看的懂,不過前面的就看不太懂了!

    可以請大大幫我解釋一下嘛!感激不盡。

     

    by 正在學習中的學生

     

    2007年11月25日 上午 08:32

解答

  • Dim vLocation As Point = New Point(0, 0) ' 定義左上角起始點座標
    Dim hWnd As IntPtr = MyFindWindow(, TextBox1.Text) ' 尋找指定標題列的視窗,並沒有一定要自己視窗
    Dim vSize As Size = GetWindowSize(hWnd) ' 取得指定視窗的長寬

     

    那個函式是在 VB2003 年代寫的,從自己視窗複製的話,VB2005 提供 Graphics.CopyFromScreen 這個方法會比較方便。


    2007年11月25日 上午 09:16
    版主

所有回覆

  • Dim vLocation As Point = New Point(0, 0) ' 定義左上角起始點座標
    Dim hWnd As IntPtr = MyFindWindow(, TextBox1.Text) ' 尋找指定標題列的視窗,並沒有一定要自己視窗
    Dim vSize As Size = GetWindowSize(hWnd) ' 取得指定視窗的長寬

     

    那個函式是在 VB2003 年代寫的,從自己視窗複製的話,VB2005 提供 Graphics.CopyFromScreen 這個方法會比較方便。


    2007年11月25日 上午 09:16
    版主
  • 這部份是我自己寫的擷取圖片程式碼可以正常運行:

    程式碼區塊

    '將執行結果畫面擷取下來存檔
    Dim g As Graphics
    Dim bmp As Bitmap
    bmp = New Bitmap(Me.Width, Me.Height)


    '利用這個bmp物件來建立一個繪圖物件, 這個物件才能拿來繪圖
    '為了避免存起來的圖背景是灰的,先將背景畫成白色
    g = Graphics.FromImage(bmp)  


    g.CopyFromScreen(New Point(Me.Left, Me.Top), New Point(0, 0), _

                             New Size(Me.Width,Me.Height)) 

    'g.CopyFromScreen(來源左上角點 in Screen, 目的左上角的點 in Graphics, 來源Size)
    g.Dispose()
    bmp.Save("D:\data\Image\" & i + 1 & ".jpg")

     

     

    之後我把它套用到For迴圈裡面:

    程式碼區塊

    For i = 0 To subDirs.Length - 1

     

    Car = New GetFunction
    Car.gogo(subDirs(i))

    '將執行結果畫面擷取下來存檔
    Dim g As Graphics
    Dim bmp As Bitmap
    bmp = New Bitmap(Me.Width, Me.Height)


    '利用這個bmp物件來建立一個繪圖物件, 這個物件才能拿來繪圖
    '為了避免存起來的圖背景是灰的,先將背景畫成白色
    g = Graphics.FromImage(bmp)  

    g.CopyFromScreen(New Point(Me.Left, Me.Top), New Point(0, 0), _
                             New Size(Me.Width,Me.Height))

    'g.CopyFromScreen(來源左上角點 in Screen, 目的左上角的點 in Graphics, 來源Size)
    g.Dispose()
    bmp.Save("D:\data\Image\" & i + 1 & ".jpg")

     

    Next

     

     

    璉璉大大,請教一下。

    關於執行畫面擷取的問題,

    我把他寫在FOR迴圈裡面的話,

    他每次存的圖片會變成程式還沒跑完那種卡住的狀態!

    我在想是不是因為CopyFromScreen的來源是Screen的原因?

    我該怎麼去解決呢?懇求指教。

    2007年11月25日 下午 02:03
  •  小米 寫信:

    他每次存的圖片會變成程式還沒跑完那種卡住的狀態!

     

    看不懂這句話的意思。

    畫面變更時,請確認有保留足夠的 CPU 時間讓螢幕更新,此外,這種方法你的畫面必須作用中,不能為縮小或隱藏。

    2007年11月25日 下午 02:48
    版主
  • 意思就像你所說的那樣吧?

    我沒有讓他有足夠的時間顯示,就去跑下一個function。

     

    程式碼區塊

    Car.gogo(subDirs(i))

     

     

    對!就像璉璉大大你說的,

    這種方法的畫面必須作用中,不能為縮小或隱藏。

    因為我是擷取Screen的圖片!

    程式碼區塊

    g.CopyFromScreen(New Point(Me.Left, Me.Top), New Point(0, 0), _
                             New Size(Me.Width,Me.Height))

    'g.CopyFromScreen(來源左上角點 in Screen, 目的左上角的點 in Graphics, 來源Size)

     

     

    那我該怎麼去解決呢?

    若直接擷取表單的圖片可以解決這樣的問題嗎?

    還是說一定要讓他有足夠的時間顯示?

    我要怎麼讓他有足夠的時間@@?讓程式暫時Delay幾秒?怎麼實做?

    懇求指教,謝謝。

    2007年11月25日 下午 03:00
  • 方向有兩種:

    1. 多緒 (把問題複雜化了)

    2. 繪圖動作完強制重整,也就是呼叫

    Me.Refresh()

     

    不過這個重整是整個畫面立即重繪,最好視需要僅針對更新的控制項下 Refresh 方法。

    2007年11月25日 下午 03:07
    版主
  • 多謝璉璉大大的細心指教,

    我已經可以正常擷圖了。

     

    不過雖然目的已經達成,但是另外想了解的是關於以下程式碼:

    程式碼區塊

    g.CopyFromScreen(New Point(Me.Left, Me.Top), New Point(0, 0), _
                             New Size(Me.Width,Me.Height))

    'g.CopyFromScreen(來源左上角點 in Screen, 目的左上角的點 in Graphics, 來源Size

     

     

    這個方法的來源是Screen,

    有函式的來源是表單的嗎?

    2007年11月25日 下午 05:44
  • 我那個就是可表單、可螢幕的程式碼。

     

    hWnd = GetDesktopWindow 就是抓桌面

    hWnd = Me.Handle 就是抓自己

    hWnd = FindWindow 就是抓指定標題視窗

    hWnd = PictureBox.Handle 就是直接抓圖片盒

    ...

     

    看怎樣決定 hWnd ,就可以得到不同效果。

    2007年11月26日 上午 12:06
    版主