[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/01/25(Thu) 22:40
投稿者名:sakusaku
Eメール:
URL :
タイトル:
画面上のある点の色の取得
はじめまして。よろしくお願いします。

画面上のマウスの位置の色を取得したいと思い
いろいろ試しているのですがなかなかうまくいきません

Option Explicit
'位置座標を受け取る構造体
Private Type POINTAPI
        x As Long
        y As Long
End Type
'現在のマウスカーソルの位置座標を取得する
Private Declare Function GetCursorPos Lib "user32" _
    (lpPoint As POINTAPI) As Long
Private MoP As POINTAPI             '現在のマウスポインタの位置座標

Private Declare Function GetPixel Lib "gdi32.dll" _
        (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
        
        
Private Sub Form_Load()
    Timer3.Interval = 500 'ミリ秒で指定
End Sub

Private Sub Timer3_Timer()
Dim MyColor
    GetCursorPos MoP
    Labelx.Caption = MoP.x
    Labely.Caption = MoP.y
    MyColor = GetPixel(hdc, MoP.x, MoP.y)
    Label4.Caption = MyColor
End Sub

わからない事としましては
hdcに何を入れてやればいいのか?
変数MyColorの型は何にすればいいのか?

現在、このコードを実行すると−1が帰ってきますが
これは何を意味しているのでしょうか?
(たぶんhdcが設定されていないためにきちんとした
値が取れていないって意味だとは思うのですが)

ちなみにhdcをMe.hdcにするとフォーム内で2種類の
値が帰ってきます

よろしくお願いします

投稿時間:2007/01/25(Thu) 23:12
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 画面上のある点の色の取得
> hdcに何を入れてやればいいのか?
> 変数MyColorの型は何にすればいいのか?

自分でコードを書いたではないのですか?私の行くとこどこでしょうと聞かれても
(画面上と言っても色々あると思うのですが) 
ここの[当サイト内・外の検索]から[GetPixel]をキーワードにGoogle等で
検索して調べてみましたか?
このサイトのサンプル然り。

多分下記のような事がしたいのでは。
http://hpcgi1.nifty.com/MADIA/Vcbbs/wwwlng.cgi?print+200604/06040054.txt

投稿時間:2007/01/26(Fri) 00:52
投稿者名:sakusaku
Eメール:
URL :
タイトル:
[解決] 画面上のある点の色の取得
とりあえずこんな感じでフォーム以外の色も取れそうなんで解決とします
(まだ色のコードは取れてないですが)

Option Explicit
'位置座標を受け取る構造体
Private Type POINTAPI
        x As Long
        y As Long
End Type
'現在のマウスカーソルの位置座標を取得する
Private Declare Function GetCursorPos Lib "user32" _
    (lpPoint As POINTAPI) As Long
Private MoP As POINTAPI             '現在のマウスポインタの位置座標

Private Declare Function GetDC Lib "user32" _
    (ByVal hwnd As Long) As Long
    
Private Declare Function WindowFromPoint Lib "user32" _
    (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetPixel Lib "gdi32.dll" _
        (ByVal hTargetDC As Long, ByVal x As Long, ByVal y As Long) As Long

Dim MyColor
Dim hTargetDC As Long
Dim hTargetWin As Long
    
Private Sub Form_Load()
    Timer3.Interval = 500 'ミリ秒で指定
End Sub

Private Sub Timer3_Timer()
    hTargetWin = WindowFromPoint(0, 0)
    hTargetDC = GetDC(hTargetWin)
    
    GetCursorPos MoP
    Labelx.Caption = MoP.x
    Labely.Caption = MoP.y
    MyColor = GetPixel(hTargetDC, MoP.x, MoP.y)
    Label4.Caption = MyColor
End Sub

投稿時間:2007/01/26(Fri) 01:07
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: [解決] 画面上のある点の色の取得
>     MyColor = GetPixel(hTargetDC, MoP.x, MoP.y)
戻り値が -1 になっていませんか?
又、取得したハンドルは解放するようにして下さい。

投稿時間:2007/01/26(Fri) 11:13
投稿者名:sakusaku
Eメール:
URL :
タイトル:
Re^2: [解決] 画面上のある点の色の取得
> 戻り値が -1 になっていませんか?

一応、-1以外の数字が返ってきています
(カラーコードに変換できてないんで、その数字の意味は
わかりませんが、今回自分にとって何色であるかの
判別は必要ない(デスクトップ上のある1点の色が
変わったというイベントが取りたかった)ので
OKです)


> 又、取得したハンドルは解放するようにして下さい。

ご助言ありがとうございます

まだVBは始めたばかりで右も左も解らない状態ですが
勉強させていただきます
今後ともよろしくお願いします

投稿時間:2007/01/26(Fri) 12:50
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^3: [解決] 画面上のある点の色の取得
> (カラーコードに変換できてないんで、その数字の意味は
> わかりませんが、今回自分にとって何色であるかの

Long 型のカラー値が返ってきているので、下記のようにすれば変換できます

Private Sub Command2_Click()
   Dim lngColor As Long
   Dim R As Integer
   Dim G As Integer
   Dim B As Integer
   lngColor = 16777215
   R = lngColor And vbRed
   G = (lngColor And vbGreen) \ &H100
   B = (lngColor And vbBlue) \ &H10000
   Debug.Print R, G, B
   If RGB(R, G, B) = vbWhite Then
      Debug.Print "明るい白です"
   End If
End Sub

投稿時間:2007/01/26(Fri) 20:07
投稿者名:sakusaku
Eメール:
URL :
タイトル:
Re^4: [解決] 画面上のある点の色の取得
サンプルを頂き、ありがとうございます。