2012-04-05 66 views
0

我正在設計一個伴隨我們電話系統的播放器應用程序。當我們的呼叫者接聽電話時,它會記錄每個電話的錄音。他們可以進入列表模塊,找到錄音並雙擊,這會打開我的播放器。我遇到的問題是,如果聽筒接到另一個電話,我的播放器不知道它,並且會繼續播放。我正在尋找一種方法來監視特定區域的屏幕,當它看到黃色或紅色而不是藍色時,它會暫停我的播放器。在Visual Basic中監視某個顏色的屏幕區域

電話系統沒有任何我可以掛接的API,所以我必須以另一種方式嘗試。

屏幕分辨率永遠不會改變,它們接收呼叫的隊列按鈕將永遠是靜態的。當他們接到電話時,一小塊區域會從背景顏色藍色變爲黃色或紅色以指示呼叫。

有什麼建議嗎?

**編輯 終極密碼基於下面的答案和問題Memory Leak using GetPixel/GetDC in Visual Basic

Private Function CheckforCall() 
    Dim hDC As IntPtr = GetDC(0) 
    Try 
     Dim queue1 As Integer = GetPixel(hDC, 40, 573) 
     Dim queue2 As Integer = GetPixel(hDC, 140, 573) 
     Dim queue3 As Integer = GetPixel(hDC, 240, 573) 
     Dim queue4 As Integer = GetPixel(hDC, 340, 573) 
     Dim queue5 As Integer = GetPixel(hDC, 440, 573) 

     If queue1 <> 9990727 Then 
      lblRinger.Text = "In Calls GOT CALL" 
      Return True 
     ElseIf queue2 <> 9990727 Then 
      lblRinger.Text = "Admin GOT CALL" 
      Return True 
     ElseIf queue3 <> 9990727 Then 
      lblRinger.Text = "Overflow GOT CALL" 
      Return True 
     ElseIf queue4 <> 9990727 Then 
      lblRinger.Text = "Bi-Lingual GOT CALL" 
      Return True 
     ElseIf queue5 <> 9990727 Then 
      lblRinger.Text = "Intercom GOT CALL" 
      Return True 
     Else 
      lblRinger.Text = "No Call" 
      Return False 
     End If 

    Catch ex As Exception 
     Return False 
    Finally 
     ReleaseDC(0, hDC) 
    End Try 

End Function 
+0

http://stackoverflow.com/a/28257727/4515800 有你的答案,riiiiiiiight這裏Geezzer;)^^^^^^^^^ – Turner 2015-01-31 23:47:31

+0

@@@@@@@@@@@ @ 回答BELOW 的http://計算器。COM/A /4515800分之28257727 @@@@@@@@@@@@@ – Turner 2015-01-31 23:50:53

回答

0

我敢肯定這是你想要什麼:

http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.getpixel.aspx

祝你好運!

編輯:

我忘了,你必須給設備上下文(hDC)有GetPixel工作。有時很難處理GetDC需要的窗口句柄(hWnd),因此您可以簡單地使用GetDC(0)獲取整個屏幕的設備上下文。從http://www.vbforums.com/showthread.php?t=491397無恥地竊取

代碼:

Declare Auto Function FindWindow Lib "user32" (_ 
    ByVal lpClassName As String, _ 
    ByVal lpWindowName As String) As IntPtr 

Declare Function GetDC Lib "user32" (ByVal hWnd As IntPtr) As IntPtr 
Declare Function ReleaseDC Lib "user32" (ByVal hwnd As IntPtr, ByVal hdc As IntPtr) As IntPtr 

Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As IntPtr, ByVal X As Int32, ByVal Y As Int32) As Int32 

Public Function GetColorAt(ByVal X As Int32, ByVal Y As Int32) As Int32 

    Dim hWnd As IntPtr 
    Dim hDC As IntPtr 

    hWnd = FindWindow(vbNullString, "RagII") 

    hDC = GetDC(hWnd) 

    Dim lColor As Int32 = GetPixel(hDC, X, Y) 

    ReleaseDC(hWnd, hDC) 

    Return lColor 
End Function 
+0

我已經得到了所呈現的這些網站上的其他代碼的形式運行的測試應用程序。該示例允許您移動鼠標並捕獲光標位置的像素顏色。我修改它來檢查5個像素。現在集成到我的播放器中。我會在正常工作時發佈正確的代碼。謝謝! – 2012-04-06 15:55:36

+0

代碼發佈...但得到一個內存泄漏.... – 2012-04-06 19:27:09

+0

正確的工作代碼張貼在上面。 – 2012-04-07 03:52:08

0

可以使用PrintWindow函數從Win32 API來獲取位圖的一個特定的窗口。然後,您可以用Bitmap.GetPixel讀取該位圖的像素:

你需要使用DllImport導入該(甚至更多功能):

<DllImport("user32.dll")> _ 
Private Shared Function PrintWindow(hwnd As IntPtr, hdcBlt As IntPtr, nFlags As UInteger) As Boolean 

這裏是一個小示例代碼捕獲窗口:

Using bm As New Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format16bppRgb555) 
    Dim g As Graphics = Graphics.FromImage(bm) 
    Dim hdc As IntPtr = g.GetHdc() 
    PrintWindow(hwnd, hdc, 0) 'hwnd is the window handle of the phone application 
    g.ReleaseHdc(hdc) 
    g.Flush() 
    Return Image.FromHbitmap(bm.GetHbitmap()) 
End Using 

但是:試着看看是否真的沒有另一種方法來解決這個問題。捕獲屏幕將是一個脆弱的解決方案,只能等待下一次更新的調用軟件。