• ベストアンサー

マウス位置の色を得る

マウス位置は 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( ) の引数やソースの書式を教えてほしいです。

  • A__
  • お礼率59% (194/328)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

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); でいけるんじゃないかと思います。 確認してないのでアヤシイですが。 「回答に対する自信」はホントの所「全くなし」です。

A__
質問者

お礼

ありがとうございます。 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 でした。 ソースを教えてください。

その他の回答 (3)

回答No.4

#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; 以下略。 毎度ながら「回答に対する自信」は「皆無」です。

A__
質問者

お礼

デスクトップのマウス位置なら GetDC( 0 ) でいい と書いてあるサイトがあったけど、GetDC(HWND_DESKTOP) でないとだめでした。 ScreenToClient( ) でクライアント座標にすることもできました。 color の出力も直して、色を得ることができました。 ありがとうございます。

  • honiyon
  • ベストアンサー率37% (331/872)
回答No.3

こんにちは、honiyonです。  どの部分のソースが分からないのか、分かりませんので一通り流れを書きます。 -------------------------------------------------------------- HDC ScreenHDC; TCanvas ScreenCanvas; //デスクトップキャンバス作成 ScreenHDC = GetDC( 0 ); ScreenCanvas.Handle = ScreenHDC; ~必要な処理~ //後始末 ReleaseDC( 0, ScreenHDC ); --------------------------------------------------------------  Delphiのソースからそれらしく変換したもので、動作確認はとっていません。  多分これで合っていると思いますが、間違っていたらゴメンサイ。  参考になれば幸いです(..

A__
質問者

補足

ありがとうございます。 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)
回答No.1

こんにちは、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クラスが用意できます。  参考になれば幸いです(..

A__
質問者

お礼

ありがとうございます。 デスクトップの色を得る方法でやろうと思いました。 でも、ソースが分からなくてうまくいってないんです。

関連するQ&A

  • VBAで ScreenToClient を使いたい

    Excel VBA で、ユーザーフォームをクリックしたときのポインタのクライアント座標を取得し、フォーム上のラベルに表示するというスクリプトを作ろうと思っています。 ウェブで探し当てたVBのソースなどを参考にして、スクリーン座標を取得するところまではうまくいきましたが、「ScreenToClient」関数の書式がVB のソースと同じでは動かないようで、「コンパイルエラー:メソッドまたはデータメンバがみつかりません」というエラー表示が出て止まってしまいます(「Me」を「UserForm1」に代えても結果は同じでした)。 以下は実際のVBAソースです。どのようにすれば動くようになるのか、ご教示頂けませんでしょうか。宜しくお願いします。 'カーソルの位置座標をスクリーン座標で取得するAPI関数 Private Declare Function GetCursorPos Lib "user32" _ (lpPoint As POINT) As Long 'カーソルの位置座標をスクリーン座標からクライアント座標へ変換するAPI関数 Private Declare Function ScreenToClient Lib "user32" _ (ByVal hWnd As Long, lpPoint As POINT) As Long 'カーソルの位置座標用変数 Private CuP As POINT '位置座標を受け取る構造体 Private Type POINT x As Long y As Long End Type Private Sub UserForm_Click() 'スクリーン座標を取得 GetCursorPos CuP Label1.Caption = "クリック位置のスクリーン座標 X=" & CuP.x & " Y=" & CuP.y '↑ここまではうまく動いています 'クライアント座標に変換 ret = ScreenToClient(Me.hWnd, CuP) Label2.Caption = "クリック位置のクライアント座標 X=" & CuP.x & " Y=" & CuP.y End Sub

  • C# でウインド内のマウスの位置

    private void Form1_DragDrop(object sender, DragEventArgs e) { Point p = new Point(e.X, e.Y); では、ウインドウではなく、画面でのマウス位置がpに取得されます。 ウインドウ内での位置を取得したいのですが、方法がわかりません。 よろしくお願いします。

  • マウスのある個所の色

    お世話になります よろしくお願いします Pictureboxをクリックされたときに そのPictureboxがクリックされた箇所の色を16進数で取得したいのですが うまくいきません どこが間違っているのか教えてもらえないでしょうか? ソースは Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Type POINTAPI x As Long y As Long End Type Private Sub Picture1_Click() Dim Poi As POINTAPI Dim iro As Long GetCursorPos Poi iro = GetPixel(Me.Picture1.hdc, Poi.x, Poi.y) Me.Label2.Caption = Poi.x Me.Label3.Caption = Poi.y Me.Label1.Caption = iro CloseHandle (Me.Picture1.hdc) End Sub GetPixcelの引数に-1しか入りません あと、もし数値で取れたとして それを16進数にする方法を教えてください よろしくお願いします

  • JavaScriptでマウス位置をリアルタイムで取得

    ウィンドウを開いたら、マウス位置をリアルタイムで取得し、ウィンドウ上に表示ということをしたいのですが、まったくわかりません。 function mousecursor(evt){ //関数の定義 X = event.x; //イベント発生場所のX座標取得 Y = event.y; //イベント発生場所のY座標取得 window.status = X + "," + Y;} //ステータスバーに表示 document.onmousemove = mousecursor; //マウスカーソルが動いたら、関数を呼び出す。(bodyタグで呼び出しも可) というようなソースを手に入れたのでやってみたら、できることはできたんですが、なんとなくしか意味がわかってません。 HTMLやPerl、VBAなどはできるんですが、どうしてもJavaScriptがあんまり理解できないんです…。 リアルタイムで取得し、表示、ということではなくても、自分の任意したように出力させたいんです。 (たとえばどこかをクリックしたらアラート表示など) よろしくお願いします。

  • クリックした位置の値が正確に表示できません。

    マウスでクリックした位置の値が正確に表示されないのですが、どうしたらよいでしょうか?何かいいアドバイスがあればよろしくお願いします。    ax=(int)(point.x/1.4);    ay=(int)(point.y/1.4);    sprintf("buf,"クリックした位置:%d",ax);    PDC->TextOut(x0+130,y0+250,buf);    sprintf("buf,"クリックした位置:d",ay);    pDC->TextOut(445,y0+250,buf); これは、クリックした位置の表示のしかたです。ax,ayはクリックした位置、正確にいうとpoint.xとpoint.yですが、都合により1.4で割りax.ayに格納しています。 // オーバーレイウィンドウの作成 // Create overlay window if(hWndOverlay == NULL) CreateOverlayWindow(); // オーバーレイウィンドウの作成 // Create overlay window enc_return = ENC_Create_Overlay_Window(ENC_ID, m_hWnd, &hWndOverlay, 0, 0, rc.right, rc.bottom); 一応、これがオーバーレイウィンドウの作成部分のプログラムです。抜粋して載せたのでわかりにくいかもしれませんがお願いします。 カメラから静止画をキャプキャして行っていたときは、うまくいったのですが、オーバーレイではうまくいきません。

  • キーボードでポインタの位置を決める

    C言語を用いて、プログラミングを行っています。 マウスのように、キーボードで x, y座標を入力し、 その座標にカーソルが移動するようにしたいのですが、 座標情報をどのように処理すれば、カーソルの位置が移動してくれるのかわかりません。 恐れ入りますが、どなたかご教授いただけないでしょうか。

  • ポップアップメニュー

    NotifyIconでタスクバーに呼び出したアイコンの上で右クリックをしたら、ポップアップメニューが表示させるように作りたいのですが、作り方が分かりません。(サイトなどを見たりしました。) 出きれば教えて頂きたいと思います。 *何をしたいのか↓ タスクトレイで表示されたアイコンを右クリックをするとポップアップメニューが出る。 ・環境 Microsoft Visual C++ SDK HINSTANCE hInst; POINT point; static HMENU hMenu,hSubMenu; /////////////////省略/////////////////// case WM_RBUTTONDOWN:  hMenu = LoadMenu(hInst,"MENUDATA");  hSubMenu = GetSubMenu(hMenu,0);  point.x = LOWORD(lParam);  point.y = LOWORD(lParam);  TrackPopupMenu(hSubMenu,TPM_LEFTALIGN,point.x,point.y,0,hWnd,NULL); break; これではうまくいかないのでご助言お願いします。

  • CTreeCtrlのHitTestメソッドについて

    環境:WinXP VS2005 MFC使用 CTreeCtrlに階層のあるアイテムを複数個設定しています。 ノード開閉時にカーソル位置にあるアイテムをGetCorsorPos()+HitTest()関数を使用し、取得していました。これは正しいアイテムのハンドルが返ってきています。 ところが、ある程度ノードを開いていき、表示しきれなくなるとスクロールが表示されますが、一番下までスクロールしている状態だとアイテムがうまく取得できていないようです。 おそらく、GetCursorPosが画面上の相対座標を取得するのに対し、HitTestで設定するのはツリーコントロール自体の相対座標なので、スクロールしている分だけずれてしまっているのではないかと思っているのですが、スクロールしているサイズを取得する方法がわかりませんでした。ご存じの方いましたらご教授をお願いします。 ※ソース抜粋 void CTestTreeCtrl::OnTvnItemexpanded(NMHDR *pNMHDR, LRESULT *pResult) { CPoint point; GetCursorPos(&point); ScreenToClient(&point); // マウスカーソルの位置からアイテムのハンドルを取得する HTREEITEM hItem = HitTest(point);           ・           ・           ・

  • MATLABのrbboxについての質問です。

    MATLABのrbboxについての質問です。 MATLABである画像の領域内の情報を取得できるようにしたいのですが、調べてみると、rbboxという関数を使って出来るらしいです。実際にMATLABのHPにあったソースコードを動かしてみると、画像にマウスでドラッグした領域の枠が描かれるのですが、その画像の領域をどうやって処理を行えるように出来るのかがわかりません。出来れば教えてほしいです。rbboxのソースコードを下に示します。宜しくお願いします。 figure; pcolor(peaks); k = waitforbuttonpress; point1 = get(gca,'CurrentPoint'); % ボタンダウンの検出 finalRect = rbbox; % figure単位の出力 point2 = get(gca,'CurrentPoint'); % ボタンアップの検出 point1 = point1(1,1:2); % x と y の抽出 point2 = point2(1,1:2); p1 = min(point1,point2); % 位置と大きさの計算 offset = abs(point1-point2); % x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)]; y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)]; hold on axis manual plot(x,y,'r','linewidth',5) % ボックスの回りに選択した領域の描画

  • ソースコードの間違いを教えて下さい

    10日で覚えるjava第三版 84-85Pのソースをコンパイルして実行すると Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at lesson09.Lesson09.main(Lesson09.java:6) と出てきてしまいます。 6行目に問題があるようですが、私は初心者のために下記で調べてみても http://www.javaroad.jp/faq/faq_error2.htm#q5 配列の何が問題なのか良く分かりません。 どこをどう直したら動くのでしょうか? また、この本は書いてないことが多いような気がします。 他の本で勉強した方が良いでしょうか? 以下、問題のあったソースコードです public class Lesson09 { public static void main(String[] args) { int x,y; //実行引数の受け取りをint型に変換する x = Integer.parseInt(args[0]); y = Integer.parseInt(args[1]); //Pointオブジェクトの生成する java.awt.Point point = new java.awt.Point(); //座標を設定する point.setLocation(x,y); System.out.println("X, Y座標をフィールドで参照します (int) "); //フィールドで座標を取得する System.out.println("X 座標 : " + point.x); System.out.println("Y 座標 : " + point.y); System.out.println("X, Y座標をgetメソッドで参照します(double)"); //getメソッドで座標を取得する System.out.println("X 座標 : " + point.getX()); System.out.println("Y 座標 : " + point.getY()); } }

    • ベストアンサー
    • Java

専門家に質問してみよう