誰かおしえてください!
VB.NETでWIN32APIを利用して画面のRGB値の取得をしようと思っています。使用APIは以下です。
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
取得はタイマーのなかで行っています。
①デスクトップの座標(10,10)のウインドウのハンドルを取得します。
②①のウインドウのデバイスコンテキストの取得をします。
③②のデバイスコンテキストの座標(10,10)のRGB値を取得します。
しかしながらRGB値は255,255,255しかかえってきません。
どこが悪いのかがわからない状況です。
どなたがご指摘お願いします。
①〜③のソースです。
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim hTargetWin As Long '対象のウィンドウのハンドル
Dim hTargetDC As Long 'デバイスコンテキストへのハンドル
'①
hTargetWin = WindowFromPoint(10, 10)
'②
hTargetDC = GetDC(hTargetWin)
Dim lngcolor As Long
'③
lngcolor = GetPixel(hTargetDC, 10, 10)
ReleaseDC(hTargetDC, hTargetWin)
End Sub
> 使用APIは以下です。
いずれの関数も、宣言が間違っていますよ。
たとえば、GetDC に関しては、
Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
ではなく、
Public Declare Function GetDC Lib "user32" (ByVal hwnd As IntPtr) As Int32
などとしてみて下さい。
# VB.NETのLong型は64bitですが、APIの多くは、整数を32bitで取り扱います。
THANK YOU!!
魔界の仮面弁士さんありがとうございました。
確かにLong型で取得していたときは先頭32ビットに変な数値が入っていて気になっていました。そういうことなんですね。
勉強になりました。1日で解決できたので、すごく嬉しいです。
また分からないことがでてくれば、書き込みさせてもらいます。
ツイート | ![]() |