dポイントプレゼントキャンペーン実施中!

kimarioと申します。

実行中の、あるアプリケーションの任意座標位置のRGB値を取得し、その結果を
メッセージボックスにて表示させたいと考えております。
しかし下記のプログラムを実行すると、どの座標位置でもすべて(-1)で返ってき
てしまいます。

getDCの戻り値が(0)ではないことを確認しているので、デバイスコンテキストの
ハンドルは取得できているものと思われます。
API初心者です。よろしくお願いいたします。

補足)
アプリケーションのウィンドウタイトルが「XXYYZZ」
色を特定したい座標を(60, 60)としています。

############################################################################

public partial class Form1 : Form
{
[DllImport("user32.dll")]
static extern IntPtr GetDC(IntPtr hWnd);
[DllImport( "user32.dll" )]
static extern int ReleaseDC( IntPtr hWnd, IntPtr hDC );
[DllImport( "gdi32.dll" )]
static extern int GetPixel( IntPtr hDC, int x, int y );

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
foreach (Process p in Process.GetProcesses())
{
if (p.MainWindowHandle != IntPtr.Zero)
{
if (p.MainWindowTitle == "XXYYZZ")
{
IntPtr dc = GetDC(p.MainWindowHandle);
MessageBox.Show(GetPixel(dc, 60, 60).ToString());
}
}
}
}
}

A 回答 (2件)

すいません、


どうやら私の方が先入観で書いてしまっていたようです。

MSDN によると――
>現在のクリッピング領域の外側の座標が指定されたときは、
CLR_INVALID が返ります。

CLR_INVALID は wingdi.h をみるに 0xFFFFFFFF = -1 なので、
おそらく上記のエラーが報告されているのだと思われます。
描画範囲の外側を指定していないかどうか、
誤ったクリッピング領域の設定を行っていないかどうか、
などをチェックしてみてはいかがでしょうか。

……ドキュメントくらい確認しておくべきでした。
    • good
    • 0
この回答へのお礼

norachlo様

本日無事結果を得ることができました。
getDCでは相変わらず(-1)の結果しか返って来ませんでしたが
getWindowDCで試したところ無事期待値が返ってきました。

先日、getWindowDCを用いてテストしたが駄目だったと報告しましたが、
おそらく座標上に何らかのウィンドウが重なっていたためと思われます。
検証方法が雑だったためであり反省しております。

>描画範囲の外側を指定していないかどうか
が解決のヒントとなりました。
ありがとうございました。

お礼日時:2009/01/14 19:38

こんばんは。



(60, 60)の座標は何色でしょうか。もし白なら
(r,g,b,a) = (FF,FF,FF,FF) = 0xffffffff = -1
で正常なのだと思います(バイトの並び順は BGRA だったかもしれませんが……)。

この回答への補足

norachlo様 こんにちは

なるほど、固定観念からか(-1)は異常値であると思い込んでいました。
お恥ずかしい限りです。

(60, 60)の色は白ではありません、また別座標(当然白以外)を指定し
ても常に(-1)が返ってくるのです。

その後もgetDCをgetWindowDCでやってみたりと試行錯誤してみまし
たが未だ結果が得られていません。

補足日時:2009/01/13 11:17
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!