• ベストアンサー

マウス位置の色を得る

fatal_errorの回答

回答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 の出力も直して、色を得ることができました。 ありがとうございます。

関連する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