2012-04-05 9 views
0

私は電話システムに付属するプレーヤーアプリケーションを設計しています。コールテイカーがコールを受信すると、各コールの記録が作成されます。彼らはリストモジュールに行き、録音を見つけてダブルクリックして、私のプレーヤーを開きます。私が持っている問題は、コールテイカーが別のコールを取得した場合、私のプレーヤーはそれを知らず、プレイを続けるということです。私は特定のエリアの画面を監視する方法を探しています。ブルーの代わりに黄色や赤色が見えるときは、プレイヤーを一時停止します。Visual Basicで特定の色の画面領域を監視します

電話システムには私が接続できるAPIはありませんので、別の方法で試してみる必要があります。

画面の解像度は決して変更されず、コールを受信するキューボタンは常に静的になります。彼らが電話を受けると、小さな領域が背景色の青色から黄色または赤色に変わり、電話がかかります。

提案がありますか?

** EDIT 最終的なコード下の回答に基づいており、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 Geezzer riiiiiiiightここで、あなたの答えを得た;)^^^^^^^^^ – Turner

+0

@@@@@@@@@@@ @ は ます。http BELOW回答:// stackoverflowの。COM// 28257727/4515800 @@@@@@@@@@@@@ – Turner

答えて

0

私は、これはあなたが望むものであることをかなり確信して質問:

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

幸運!

EDIT:

私はあなたがGetPixel仕事を持っているデバイスコンテキスト(hDC)を与える必要が忘れてしまいました。 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ピクセルをチェックするように修正しました。私のプレーヤーに今すぐ統合する。私はそれが働いているときに私は適切なコードを掲載します。ありがとう! –

+0

コードが掲載されました...しかし、メモリリークが発生しました.... –

+0

上記の正しい動作コード。 –

0

あなたが特定のウィンドウのビットマップを取得するためのWin32 APIからPrintWindow機能を使用することができます。その後、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 

ただし、本当にこれを解決する方法がないかどうかを確認してください。画面をキャプチャすることは、呼び出し元のソフトウェアの次回のアップデートで壊れるのを待っている脆弱なソリューションになります。

関連する問題