none
取得螢幕畫素顏色 RRS feed

  • 問題

  • Public Class GetColor
        Private Declare Function GetDC Lib "user32" (ByVal hwnd As Int32) As Int32
        Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Int32, ByVal hdc As Int32) As Int32
        Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
        Public Function GetPixelColor(ByVal x As Int16, ByVal y As Int16) As Color
            Dim kk As Int32 = GetPixel(GetDC(0), x, y)
            Dim Color As Color = ColorTranslator.FromWin32(kk)
            ReleaseDC(0, GetDC(0))
            Return Color
        End Function
        Public Function GetColorRGBString(ByVal x, ByVal y)
            Dim c As Color = GetPixelColor(x, y)   'Return a color   
            Return "RGB=" & c.R & "," & c.G & "," & c.B
        End Function
    End Class
    這是我用來讀取螢幕某個點的程式碼
    但執行到某個時間點,會變成不管哪個點都RGB=0,0,0
    為什麼會有這個問題啊?
    拜託知道的人救一下我!現在卡在這個問題了...
    Arthur Chen
    2009年9月7日 下午 01:33

解答

所有回覆

  • 進螢幕保護省電模式?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月7日 下午 03:15
  • 謝謝您的回復!
    我沒有開螢幕保護程式,連省電裝置都關掉了
    我主要這個程式目的是監視某一個點,當他顏色變的時候
    便做某些事情,但是當所有變成RGB=0,0,0的時候就不會變了

    我不知道這是不是API函數的BUG
    還是我電腦自己的問題,
    我先用別的軟體測看看(AutoIt)也有可以監視螢幕的
    當然我很希望用VB.NET寫
    因為AutoIt只是一個小工具

    這個問題出在監視後的一個小時~兩個小時不等,有時15分鐘就出現
    我用AutoIt看看,如果超過3小時以上都沒有發生這樣狀況
    也許是我呼叫的API函數有Bug或是我呼叫方法不對

    呼叫的方法我是上網查的

    再次謝謝您的回復!

    Arthur Chen
    2009年9月8日 上午 02:57
  • HI,

    您可以參考這個程式看看;
    http://www.csharp411.com/c-getpixel-and-setpixel/
    • 已標示為解答 Big Cat 2009年9月8日 上午 05:27
    2009年9月8日 上午 03:20
  • 那看到的結果是啥?透過 SendMessage 發出 WM_PAINT 要求重繪呢?
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年9月8日 上午 04:23
  • Hi,

    我覺得是你取得顏色值後
    轉成Color轉錯了

    可參考

    http://www.dotblogs.com.tw/larrynung/
    2009年9月8日 上午 04:38
  • 先謝謝你們~等我放假再來測試看看,用那幾種不同呼叫的方式

    只是我得先說,我一開始取得都正確耶
    轉換一開始都不是0,0,0
    直到一陣子以後才0,0,0的

    謝謝您們的熱心回復!
    Arthur Chen
    2009年9月8日 上午 05:26
  •     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            ListBox1.Items.Clear()
            For i As Integer = 0 To 10000
                Dim c1 As Color = ColorTranslator.FromWin32(i)
                ListBox1.Items.Add("RGB=" & c1.R & "," & c1.G & "," & c1.B)
    
                Dim c2 As Color = ConvertFromWin32Color(i)
                ListBox1.Items.Add("RGB=" & c2.R & "," & c2.G & "," & c2.B)
    
                Dim c3 As Color = ColorTranslator.FromOle(i)
                ListBox1.Items.Add("RGB=" & c3.R & "," & c3.G & "," & c3.B)
            Next
        End Sub
    
        Public Shared Function ConvertFromWin32Color(ByVal colorValue As Integer) As Color
            Dim r As Integer = colorValue And &HFF
            Dim g As Integer = (colorValue And &HFF00) >> 8
            Dim b As Integer = (colorValue And &HFF0000) >> 16
            Return Color.FromArgb(r, g, b)
        End Function
    試了一下用FromWin32轉好像也可以
    那就得先檢查一下P/Invoke宣告的地方對不對了
    順便把訊息秀出來確定,像是KK取到的值

    另外我看到兩個奇怪的點
    我不確定會不會影響
    你可以看一下
    像GetPixelColor這邊的參數型態變為Int16
    Public Function GetPixelColor(ByVal x As Int16, ByVal y As Int16) As Color

    還有這邊
    ReleaseDC(0, GetDC(0))
    應該會又產生個畫布
    跟本來用的不同
    可能也會有leak

    http://www.dotblogs.com.tw/larrynung/
    2009年9月8日 上午 06:44