RGB値を取得して、イベントを起こすようにするには?

解決


コロッケ  2006-02-28 23:44:02  No: 94422

例えば、(500,500)の色が赤のときにイベントを起こしたいのですが
colorAのかえってくる値が、数値になってかえってきます。
FF0000とかえってきてほしいのですが・・・・
ペイントで画面を赤く塗り、かえってくるかどうかを確かめているのですが
うまくいきません。
_________________________________________________
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

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim hTargetWin As Long   '対象のウィンドウのハンドル
        Dim hTargetDC As Long    'デバイスコンテキストへのハンドル

        hTargetWin = WindowFromPoint(0, 0)

        hTargetDC = GetDC(hTargetWin)

        Dim colorA As Long
        Dim FF0000 As Long

        colorA = GetPixel(hTargetDC, 500, 500)
        If colorA = FF0000 Then
            MsgBox("赤です。")
        Else
            MsgBox("赤以外です。")
        End If
        MsgBox(colorA)
        ReleaseDC(hTargetDC, hTargetWin)


コロッケ  2006-02-28 23:54:16  No: 94423

初心者版で質問したいと思います。
申し訳ございません。


あん  2006-02-28 23:56:23  No: 94424

>colorAのかえってくる値が、数値になってかえってきます。
その数値は16進に直すといくつになってますか?

>Dim FF0000 As Long
>If colorA = FF0000 Then
このままだとFF0000には0が入ってるような・・


コロッケ  2006-03-01 00:11:19  No: 94425

このプログラムを実行すると、まず赤以外です。と表示され次に
8977058982438895615と表示されます。
colorAのかえってきている値は8977058982438895615と思うのですが・・
まだ始めたばかりなので、進法については詳しく分かりません^^;


Seraph  2006-03-01 00:11:20  No: 94426

>If colorA = FF0000 Then

If colorA = vbRed Then
でイケるのでは?

ちなみに、
> Dim FF0000 As Long
は、16進数で定義したかったのかと思いますが、

Dim lngAKA As Long
lngAKA = &HFF0000& '末尾の&は消えるかも
とするか

Const conAKA As Long = &HFF0000&
または、
Const conAKA As Long = vbRed

と言う書き方もあります。
ともあれ、このケースでは、vbRed がいいと思います。


コロッケ  2006-03-01 00:31:09  No: 94427

ペイントで画面の色を変えても返ってくる値が、赤にしているときと、まったく一緒なのですが、どこに問題があるのでしょうか?


Seraph  2006-03-01 00:49:47  No: 94428

あ!!
VB.NET だった!

申し訳ありません。
専門外なのでどなたか答えてくださる方
よろしくお願いします。m(__)m

よく読まずに、安易に答えてしまいました。
ごめんなさい。


あん  2006-03-01 01:02:09  No: 94429

>8977058982438895615と表示されます。
ありえません。


みい  2006-03-01 01:14:24  No: 94430

> hTargetWin = WindowFromPoint(0, 0)
ここで(0,0)の位置にあるウィンドウのハンドル取ってきてますよね。
(0,0)と(500,500)のウィンドウは同じですか?


コロッケ  2006-03-01 01:25:03  No: 94431

はい、同じウィンドウの(500,500)のRGB値を取得しているつもりなのですが。
私の考えとしては、最大化したら、かならず(0,0)の位置にはウィンドウがくるので、そのウィンドウのハンドルを取得し、そのハンドルから、そのウィンドウのRGB値を取得していると考えているのですが・・・
言葉が分かりにくくて、すいません。m(_ _;)m


みい  2006-03-01 01:41:48  No: 94432

WindowFromPoint(500,500)に変更して、
GetPixelの(500,500)をScreenToClientで
クライアント座標に変換した座標に変更してみて下さい。
今テストできない状況なんで、確認できなくてすみません。


あん  2006-03-01 01:51:08  No: 94433

>hTargetWin = WindowFromPoint(0, 0)
hTargetWin = WindowFromPoint(500, 500)に変更
>colorA = GetPixel(hTargetDC, 500, 500)
colorA = GetPixel(hTargetDC, 0, 0)に変更

>hTargetDC = GetDC(hTargetWin)
hTargetDC = GetDC(0)に変更

にしてみてください。


あん  2006-03-01 01:54:57  No: 94434

0,0で取れたウインドウハンドルが
画像で使ってるハンドルとは限らないってことですね。


特攻隊長まるるう  2006-03-01 02:07:12  No: 94435

>初心者版で質問したいと思います。
結局、こちらで続けるのね?

そもそも、[VB6.0]と[VB.NET]ではAPIの宣言(特に型)が
違うよ?。


コロッケ  2006-03-01 02:11:24  No: 94436

私の開発環境はVB.NETです。


特攻隊長まるるう  2006-03-01 02:20:43  No: 94437

>私の開発環境はVB.NETです。
…知ってる(^^;)…でもAPIの宣言は[VB6.0]のままですよ?
[Visual Basic 6.0 ユーザーのための Visual Basic .NET 移行ガイド]
http://www.microsoft.com/japan/msdn/net/vbtransitionguide/
時間が無いから回答は付けないけど、GetDC の[VB.NET]版の
質問って過去ログに無かったかなぁ?ま、無ければ他のAPIに関する
質問でも[VB.NET]版はいくつも出てるから、とりあえず過去ログ検索
するか時間がある人の回答を待つべし。

#過去ログ検索する時は初心者掲示板の方もしてね?


コロッケ  2006-03-01 03:57:24  No: 94438

分かりました。基本的な知識が不足しているので、勉強してきます。><b


特攻隊長まるるう  2006-03-01 04:00:42  No: 94439

やっぱり GetDC 関連一式過去ログにあるね。動作確認までしてないので
リンクは貼らないけど、どれかは動くでしょう。
[VB.NET]でのAPIの使用に際して参考リンク
[KEN's .NET [特集6] GetPrivateProfileStringにみるAPIの使用方法]
http://www5b.biglobe.ne.jp/~yone-ken/VBNET/special/sp06_GetPrivateProfileString.html
>今までAPIを呼び出して実現していたことの多くは、.NET Frameworkのクラスライブラリに同等の機能があります。
[Microsoft Win32 と Microsoft .NET Framework API との対応]
http://www.microsoft.com/japan/msdn/net/general/win32map.asp


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加