0

電話システムに付属するプレーヤー アプリケーションを設計しています。コールテイカーが電話を受けると、各通話が録音されます。彼らはリスト モジュールに移動し、記録を見つけてダブルクリックすると、私のプレーヤーが開きます。私が抱えている問題は、受話器が別の電話を受けた場合、私のプレーヤーはそれを知らず、プレイを続けることです。特定の領域で画面を監視する方法を探しています。青ではなく黄色または赤が表示されると、プレーヤーが一時停止します。

電話システムにはフックできる API がないため、別の方法で試す必要があります。

画面の解像度が変わることはなく、通話を受信するキュー ボタンは常に静的です。電話がかかってくると、小さな領域が背景色の青から黄色または赤に変わり、電話がかかってきたことを示します。

助言がありますか?

**以下の回答と、Visual Basic で GetPixel/GetDC を使用したメモリ リークの質問に基づいて最終コードを編集します。

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
4

2 に答える 2

0

PrintWindowWin32 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

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

于 2012-04-05T20:17:46.430 に答える
0

これがあなたが望むものであると確信しています:

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

幸運を!

編集:

hDC機能させるには、デバイス コンテキスト ( ) を指定する必要があることを忘れていましたGetPixelhWnd必要なウィンドウ ハンドル ( ) を処理するのが難しい場合GetDCがあるため、 を使用して画面全体のデバイス コンテキストを簡単に取得できます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
于 2012-04-05T20:11:07.937 に答える