- ベストアンサー
マウス位置の色を得る
マウス位置は lParam にあるらしいから typedef struct tagPOINT { LONG x_zahyo_long; LONG y_zahyo_long; }POINT; POINT p; char x_zahyo[5], y_zahyo[5]; として、 case WM_RBUTTONDOWN: p.x_zahyo_long = LOWORD(lParam); p.y_zahyo_long = HIWORD(lParam); sprintf(x_zahyo,"%04d", p.x_zahyo_long); sprintf(y_zahyo,"%04d", p.y_zahyo_long); SetWindowText(hrs, x_zahyo); SetWindowText(hrs, y_zahyo); break; でやってたけど、得られた座標は常に 0001,0001 でした。 本題とは別だけど、4桁表示のやり方で、もっといいソースがあったら 教えてください。 bcc32 では lParam からマウス位置取得は無理ですか? lParam が使えなかったから、 POINT p = { 0,0 }; として、 GetCursorPos( &p ); で座標を得ました。 それで、ウインドウ上のマウスの位置の色を取得するにはどうしたら いいんですか? getPixel( ) の引数やソースの書式を教えてほしいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
WinAPIに徹するなら、 GetPixel()が妥当かなと。 COLERREF GetPixel(HDC 色を得たい座標のHDC, int X座標, int Y座標); クリックするなら相手先のウィンドウはアクティブのはずなので、 COLORREF color; HDC hdc = GetDC(GetActiveWindow()); color = GetPixel( hdc, LOWORD(lParam), HIWORD(lParam)); ReleaseDC(GetActiveWindow(), hdc); でいけるんじゃないかと思います。 確認してないのでアヤシイですが。 「回答に対する自信」はホントの所「全くなし」です。
その他の回答 (3)
- fatal_error
- ベストアンサー率39% (23/58)
#2で答えたものです。 スイマセン、素で嘘かいてました。 > クリックするなら相手先のウィンドウはアクティブのはずなので、 他のウィンドウへのメッセージが飛んでくるはずがない(汗 なに書いてんだろう、自分。 自分のウィンドウ以外の領域も見たかったらマウスフックが要りますね。 自分のウィンドウ内だけなら一番下のソースで動きました。 尚、#3の回答への補足で書かれていたソースは、 1.GetDC()の第一引数はHDCを得たいHWNDを指定しなければならない。 2.GetCursorPos()で得られる座標はスクリーン座標である。 よってScreenToClient()でクライアント座標に変換しなければいけない。 3.sprintf(zahyo, "%d %d", LOWORD(color), color);のcolorが白だと "65535 18777215"となって、配列領域外になる。 の三つの理由に動きません。 ま、マウスフックを書くなら全面的に書き直しになるとは思いますが。 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp){ char point[16]; POINT pt; HDC hdc; COLORREF color; switch(msg){ case WM_RBUTTONDOWN: GetCursorPos(&pt); sprintf(point, "%d %d", pt.x, pt.y); SetWindowText(hwnd, point); hdc = GetDC( hwnd); ScreenToClient(hwnd, &pt); color = GetPixel( hdc, pt.x, pt.y); ReleaseDC( hwnd, hdc ); sprintf(point, "%10d", color); SetWindowText(hwnd, point); break; 以下略。 毎度ながら「回答に対する自信」は「皆無」です。
お礼
デスクトップのマウス位置なら GetDC( 0 ) でいい と書いてあるサイトがあったけど、GetDC(HWND_DESKTOP) でないとだめでした。 ScreenToClient( ) でクライアント座標にすることもできました。 color の出力も直して、色を得ることができました。 ありがとうございます。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 どの部分のソースが分からないのか、分かりませんので一通り流れを書きます。 -------------------------------------------------------------- HDC ScreenHDC; TCanvas ScreenCanvas; //デスクトップキャンバス作成 ScreenHDC = GetDC( 0 ); ScreenCanvas.Handle = ScreenHDC; ~必要な処理~ //後始末 ReleaseDC( 0, ScreenHDC ); -------------------------------------------------------------- Delphiのソースからそれらしく変換したもので、動作確認はとっていません。 多分これで合っていると思いますが、間違っていたらゴメンサイ。 参考になれば幸いです(..
補足
ありがとうございます。 TCanvas が使えなくて、Tで始まっていからDelphi用の 関数だと思ったからそれを外して書きました。 それから、まだ lParam でマウス位置を得られていないから GetCursorPos( ) で書き替えて、 LRESULT CALLBACK ... char zahyo[9]; POINT p = { 0,0 }; HDC ScreenHDC; switch(msg){ case WM_RBUTTONDOWN: GetCursorPos( &p ); // ディスプレイに対するマウス位置 sprintf(zahyo, "%d %d", p.x, p.y); // char型にする SetWindowText(hrs_A, zahyo); // マウス位置表示 ScreenHDC = GetDC( 0 ); color = GetPixel( ScreenHDC, p.x, p.y); ReleaseDC( 0, ScreenHDC ); sprintf(zahyo, "%d %d", LOWORD(color), color); SetWindowText(hrs_B, zahyo); break; 実行して、case WM_RBUTTONDOWN が動作すると、 よくあるエラー3回表示になってしまいます。 マウス位置は問題なく表示されます。 ソースの間違いを教えてください。
- honiyon
- ベストアンサー率37% (331/872)
こんにちは、honiyonです。 lParamから直接取得出来るのかどうかは分からないですが、出来るはずだと思います。 因みに、メッセージを直接操作してマウス位置を取得したい場合、TWMMouse型を使うと便利ですよ。 class TForm1 ... private: procedure WM_RButtonDown(var MouseMessage: TWMMouse); message WM_RBUTTONDOWN; こんな感じです。 マウスの位置の色を取得したい場合ですが、用途にわけて二種類のやり方があります。 1.Form上やButton上、1つのImage上など、1つのオブジェクトの中でのみ色を取得出来れば良い。(ボタンやイメージを含む1つのウインドウ全体ではない) 2.ウインドウ全体のイメージの、色を取得したい。 1のケースでは、そのオブジェクトの CanvasのPixelsプロパティを使えば簡単に取得出来ます。 Canvas->Pixcelsは、そのオブジェクトの中での座標なので、マウス位置をそのオブジェクトの中での座標に変換する必要があります。 2のケースは、上記の方法ですとなかなか難しいです。Form1の(100,100)の位置にあるButton1の色を取得したい場合、Form1->Canvas->Pixels[100,100]とするだけでは、Form1の、100,100の位置の色、つまりボタンの下の色が取得されてしまいます。(確かそうだったと思う...) そのため、マウスポインタがどのオブジェクトの上にのっているか?を判断し、そのオブジェクトのCanvasを調べねばならないので面倒です。 しかしこれを楽して実現する方法があります。デスクトップ全体の Canvasを取得して、それに対して色を調べれば良いのです。そうすればどのオブジェクトが・・・とか調べる必要がありません。全部一枚の絵として取得出来るので。また、この方法であればマウスが自分のウインドウ外にいるときでも、その位置の色が取得出来ちゃいますね。 やり方は、TCanvasを自分でCreateして用意し、Canvas->Handleに、デスクトップのデバイスコンテキストを入れてあげれば、デスクトップのCanvasクラスが用意できます。 参考になれば幸いです(..
お礼
ありがとうございます。 デスクトップの色を得る方法でやろうと思いました。 でも、ソースが分からなくてうまくいってないんです。
お礼
ありがとうございます。 LRESULT CALLBACK WndProc( ... char zahyo[99]; COLORREF color; case WM_RBUTTONDOWN: color = GetPixel( HWND_DESKTOP, LOWORD(lParam), HIWORD(lParam)); sprintf(zahyo, "%d %d", LOWORD(color), color); SetWindowText(hrs, zahyo); 右クリした時のマウス位置の画面の色は color に入ると思って こんなソースにしたけど、結果は、LOWORD(color) も color も 0 でした。 ソースを教えてください。