
マウス位置は 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( ) の引数やソースの書式を教えてほしいです。
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);
でいけるんじゃないかと思います。
確認してないのでアヤシイですが。
「回答に対する自信」はホントの所「全くなし」です。
ありがとうございます。
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 でした。
ソースを教えてください。
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;
以下略。
毎度ながら「回答に対する自信」は「皆無」です。
デスクトップのマウス位置なら GetDC( 0 ) でいい
と書いてあるサイトがあったけど、GetDC(HWND_DESKTOP)
でないとだめでした。
ScreenToClient( ) でクライアント座標にすることもできました。
color の出力も直して、色を得ることができました。
ありがとうございます。
No.3
- 回答日時:
こんにちは、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回表示になってしまいます。
マウス位置は問題なく表示されます。
ソースの間違いを教えてください。
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クラスが用意できます。
参考になれば幸いです(..
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Excel(エクセル) VBA オリジナル関数で選択セルの合計を作成したい 3 2023/03/19 19:45
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- 英語 「it takes 期間 to do/doing」の意味やニュアンスの違いについて 1 2023/01/15 14:02
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マウスイベントが動かない
-
C#で、画像の、指定した座標の...
-
UWSCのCHKIMG関数について
-
画像中のある座標でマウスオー...
-
「ご処理進めて頂きますようお...
-
エクセルVBAで、MsgBox やInput...
-
EXCEL VBA 複数のImageコントロ...
-
UMLでの例外処理
-
【Excel】特定の文字を含むセル...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
UPS警告音を止めたい
-
セックスレスの既婚女性は自慰...
-
【Excel VBA】マクロボタンを表...
-
サブフォームの行ごとにコンボ...
-
CloseとDisposeの違い
-
EXCELでボタンによりスク...
-
Googleフォーム・複数人の申し...
-
Excelシート上のマクロを登録し...
-
質問が締切になったら、 自動的...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#で、画像の、指定した座標の...
-
UWSC画像認識で座標の位置がず...
-
C言語でグラフ作成??
-
Excel VBAで他アプリケーション...
-
VBA HTML要素または文字の座標...
-
uwscについて、同一の画像(仮...
-
VBでクリックイベントを発生さ...
-
エクセルVBAで画像を貼り付ける...
-
マウスイベントが動かない
-
UWSCのプログラミングついて教...
-
PostScriptについて
-
VBでデスクトップ上のアイコン...
-
UWSCのCHKIMG関数について
-
LineTo,MoveToについて
-
マウスカーソルの移動
-
UWSファイルの編集?
-
DirectX テクスチャの拡大
-
VBAで ScreenToClient を使いたい
-
高さのあるクォータービューの...
-
UWSCでPEEKCOLORを使い指定ウィ...
おすすめ情報