• 締切済み

Formの外にある画面の色を取得

Delphi XE3で始めたものです。 今まではアプリの自Formに画像をロードしてマウスをクリックするとその色を取得するものを作って動かしていましたが、最近自Formの外にある画面の色を取得するソフトがあることを知りました。 これをDelphiで作ってみたいと思いますがDelphiでこのようなことができる方法があったら教えてください。

みんなの回答

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.4

#鮮やかにスルーされてるのでコメントする気も失せますが。 SetCapture時はGetCursorPosとWindowFromPointを使います。 それが面倒ならWH_MOUSE_LLフックやDLLを作成してのグローバルフックではどうでしょうか。

cgsksnng
質問者

補足

kumatti1様 知識がないためご教示いただいたフックとかグローバルフックなどの意味が分からずまったく手のつけようがなく失礼しました。WEBで探してみると色々とあるようですのでキーワードを頼りに理解に勤めようと思います。 ありがとうございました。

  • chie65535
  • ベストアンサー率43% (8519/19366)
回答No.3

以下のページを参考に、APIでマウスをキャプチャしよう。 http://wisdom.sakura.ne.jp/system/winapi/win32/win45.html 具体的には 1.自作アプリ内に「色の取得」と言うボタンを配置して、有効化しておく。 2.自作アプリ内に「色の取得の中止」と言うボタンを配置して、無効化しておく。 3.「色の取得」のボタンが押されたイベントに飛んできたら、「色の取得」のボタンを無効化して押せないようにして(2度押しの防止)、「色の取得の中止」のボタンを有効化して押せるようにして、マウスボタンを押した時、マウスボタンを離した時のイベントを設定して、API関数のSetCapture()関数を呼ぶ。 4.「マウスボタンを押した時」のイベントに飛んできたら、マウスボタンを押した時のイベントを無効にして(イベント2重実行の抑止)、マウスカーソルを消去してから(これ重要)、画面をキャプチャして、マウスカーソルの表示を元に戻して、マウス位置をスクリーン座標に変換して、スクリーン座標に対応した位置のピクセルを取得して、カラーを24ビットカラーに変換する。 5.「マウスボタンを離した時」のイベントに飛んできたら、マウスボタンを押した時と離した時の両方のイベントを無効にして、API関数のReleaseCapture()関数を呼んで、「色の取得」のボタンを有効化して押せるようにして、「色の取得の中止」のボタンを無効化して押せないようにする。 6.「色の取得の中止」のボタンが押されたイベントに飛んできたら、マウスボタンを押した時と離した時の両方のイベントを無効にして、API関数のReleaseCapture()関数を呼んで、「色の取得」のボタンを有効化して押せるようにして、「色の取得の中止」のボタンを無効化して押せないようにする。 特に「色の取得の中止」のボタンは必須。SetCapture()関数を呼んでマウスをキャプチャしている状態で、マウスカーソルがフォームの外に居る時に、他のアプリに制御が移ったりすると、「マウスボタンを離した時」のイベントに飛んでこないまま、マウスボタンが離された状態になり、色の取得中の状態から抜け出せなくなります。 なので「マウスボタンはもう離されているのに、ボタンを離した時のイベントが起きなかった時」に備えて「色の取得の中止」のボタンが必要です。 あと、画面をキャプチャする時は「今のマウスカーソルの状態を覚えておいて、マウスカーソルを消して、画面を取り込んでから、マウスカーソルを元に戻す」と言う処理が必要。これを行わないと「ピクセルを取り込んだ位置には、常にマウスカーソルが居る」ので、画面の色じゃなく、マウスカーソルの先端の色を拾ってしまいます。 蛇足だけど、本当は「マルチスクリーン環境」の事も考えないといけない。マルチスクリーン環境で、マウスカーソルがメインモニタに居るかサブモニタに居るかで、画面とピクセルを取り込む処理を変えないといけない筈(当方はマルチモニタ環境じゃないので試せない)

cgsksnng
質問者

補足

Chie6553様 詳細なアクションをご紹介いただきありがとうございました。 今まで作った画像ファイルをロードしてから色を取得するのに代えてスクリーンをCaptureすることはできました。なおテストしたところマウスポインターはキャプチャーされないようでしたのでマウスポインター対策は不要のようでした。 この状態ではあくまでクライアント領域の範囲内での処理になりますが、これを何とかクライアントの外の情報を取得を取れないものかと思っています。例えば非表示のImage1とかTBitmapをスクリーンのサイズにして常時キャプチャーしておいて色のデータを表示するFormは小さくしておきます。これでマウスのスクリーン座標(クライアント領域外)、マウスダウン、マウスアップの情報を取得して非表示のキャプチャー画像から色を取得して小さなFormに色の情報を表示するというものを考えましたが不可能でしょうか? このようなわけでFormの外にあるSetCaptureやWMNCLButtonCLKなどを試してみましたがForm内のものしか反応しませんでした。マウスホイールなどはマウスがFormの外にあっても反応するので簡単にできるかと思っていましたがかなり大変なことに感じました。また何か情報がありましたらよろしくお願いします。

  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.2

> Formの外でのMouseMoveやMouseDownなどのイベント Formをサブクラス化してSetCaptureでマウスメッセージを処理する事になるのではと。 他はDirectInputかWM_INPUT。

  • chie65535
  • ベストアンサー率43% (8519/19366)
回答No.1

以下のページを参考に、APIでスクリーンをキャプチャしよう。 http://mrxray.on.coocan.jp/Halbow/Notes/N009.html キャプチャしたら、マウスの「スクリーン座標」を元に、キャプチャした画像からピクセルを拾い出し、24ビットカラーに変換すれば良い。 因みに「キャプチャした画像が24ビットカラーとは限らない」ので注意すべし。画面のプロパティで、画面のカラーが16ビットカラーになっている可能性もある。

cgsksnng
質問者

補足

chie65535様 情報をありがとうございます。試したところキャプチャーはできました。 これでFormの外でのMouseMoveやMouseDownなどのイベントが発生できるようになれば目的のことができると思い探してみました。いままで見たところではDelphiアプリ上のイベントでしか反応しないものばかりでした。Formの外でのMouseDownやMouseMoveなどのイベントを発生させる方法などの情報をご存知でしたら教えてください。 

関連するQ&A

  • formをもう一度Loadする方法

    form1をLoadした後 別のページに移動後またform1に戻ってきた場合 もう一度ロードするにはどうしたらいいでしょうか? 例えば、画面1で画像をクリックして消すとします。 そのページから画面2に行きまた画面1に戻った時に、ここでまたフォームをロードをして画像が消える前にしたいのです。 ロードで宣言はしているのですがうまくいきません。 調べたのですが調べ方が悪いのかまったく答えが見つかりませんでした。 お願いします。

  • Delphiで最前列にFormを表示し、フォーカス

    他のアプリを操作中に、Delphiで作成したFormをフォーカスを奪わずに表示する方法を調べています。 C++Builderなら 記事:最前面に表示するが、フォーカスは奪わない方法 http://ogawa-sankinkoutai.seesaa.net/article/115187189.html で出来るようですが、Delphiならどのようにすればいいんでしょうか? Delphi XE5 Starterを使っています。

  • 画面上の色の取得について。

    DELLの Inspiron 530s を使い始めたばかりです。 ソフトは Windows vista です。 画面上の色の取得(RGB値)ができずに困っています。 vista対応のいろんなフリーソフトを試してみたんですが、すべてだめでした。 反応しなかったり、画面が真っ黒になってしまったり、白と黒しか取得しなかったり・・です。 ホームページビルダー11に付いているウェブアートデザイナーの色の取得機能も同じように使えません。 特に何かをいじってしまった覚えはないのですけれど・・ もし、解決方法など、お分かりになる方がいらっしゃいましたら、お教えください。 どうぞよろしくお願い致します。

  • 画面左下に「Form1」というものが表示される

    最近になってなのですが、画面左下(スターとボタンの上付近)に「Form1」という文字が書かれた灰色の長方形をしたものが表示されるようになりました(ス田ターとボタンと同じぐらいのサイズ)。 出現するのはランダムのようで気が付くと出現しています。また、タスクマネージャーを起動すると消えてしまいます。 その長方形のようなものをダブルクリックすると少し大きめの黒い画面が表示されて「Hit-Plan」という赤い文字が上下にジグザグ動きながら大きくなったり小さくなったりしています。 この原因が分かる方教えてください。 またセキュリティーソフトは入れており、見た限りではWindowsの動作に影響はありません。 その画像をUPしときました。↓↓ http://www4.pf-x.net/~maruchan0223/test.bmp (タスクバーのところの黒枠は関係ないです。。。)

  • Formをロードしたときに

    はじめまして。 VB2005を使っています。 Formをロードしたときに、デザイン画面に配置してある、ButtonやPictureBoxなどのNameプロパティなどを、Object型の配列変数に取得することは可能ですか? どなたか詳しい方ご教授ください。

  • DelphiXEでコンパイルできません

    先日DelphiXEを購入しました。 XE 超初心者なので,こんなことがと言わずに助けてください。 DelphiXEを起動して, 1 「Fileメニュー」から「新規作成」「フォーム- Delphi」で,Formを開く 2 FormにTbuttonを一個乗せて, 3 button1をWクリックして,procedure TForm1.Button1Clickにshowmessage('Hello');を記述 Delphi5までは,ここでF9を押せば直ちに実行できたはずなのですが,全く反応無し 「実行メニュー」も全てグレーアウトしたまま。 ヘルプも複雑すぎて・・・とっかかりが判らない。 Delphi XE Starter Essentials eBookもDLしてみたけど・・・英語力ゼロ 旧Delphi5のプロジェクトはちゃんとコンパイルできたのですが,XE上で新規作成の場合はなにか基本的な設定が足りないようです。 どうやったら,コンパイルできるのか教えてください。 なにとぞ,なにとぞ よろしくお願いいたします。 m(_ _)m

  • (VB2008)ShowDialogしたFormを閉じた時の、画面の挙

    (VB2008)ShowDialogしたFormを閉じた時の、画面の挙動について (VB2008EE、OSはVista) Form1からForm2を(ボタンのクリックイベントで) Dim f As New Form2 f.Show(Me) と記述して表示させたあと、 Form2の(ボタンのクリックイベントで) Me.Hide() として、Form2を閉じる記述を書きました。 で、Form2をShowDialogしてから、Hideを実行すると、 Form2が消えるのはいいのですが、残るForm1が、 ・デバッグ実行時は、VB2008EEのWindowの後ろに隠れてしまい、そのままとなる。 ・リリースビルドでは、さすがにそのままとはなりませんが、一旦Form1が  ちらつきます。 この回避策がありましたら教えてください。 。。。 ここからは、いろいろ実験した結果です。 ・試しに、Me.Hide()の後ろに、Threading.Thread.Sleep(5000)を 記述して実行すると5秒間Form1が後ろのアプリ画面に隠れた後、 Form1が前に表示される。 ・この場合の「後ろの別アプリのWindow」について、その別アプリが VB2008やエクスプローラだとForm2がそのアプリに隠れるのですが、 ExcelやIEだと、Form1が後ろに隠れることがないようです。。。 ・Hideではなく、Closeだと、後ろには隠れません。 (ただし、Closeの場合、Threading.Thread.Sleep(5000)の間はForm2は その前にClose()があっても、表示されたままSleepしその後閉じます) ・さらにShowDialog()でなく、Show()の場合、Owner指定して実行した場合は、 (つまりSHow(Me))全く問題なく、Form1が前面に表示されたまま 他のアプリが前に来ることはないのですが、 Ownerを指定せずにShowしたところ、ShowDialogと同様のことが起きるようです。 もし、これらの現象全体についてしっかりと説明できる方がいらっしゃれば、 説明もしていただけるとうれしいです。

  • いくつかのアプリを操作していて、他のアプリが画面の外に隠れてしまって画面に現れないことがありますが

    いくつかのアプリを操作していて、他のアプリが画面の外に隠れてしまって画面に現れないことがありますが、簡単に復帰させる方法教えて下さい。 「最大化」なら現れますが、その後サイズ変更がききません。 要するに普通なら、ステータスバーからクリックで 普通に戻るはずなのですが

  • formの中の画像は動かせますか

    クリックする画像「購入する。」を作って、マウスを画像にのせると、 画像が下にずれて動いてくれるタグの書き方はありますか? リンク付きの画像をposition のタグを使って下にずらす事はできますが、 フォーム(form)の中にあるinput type の画像をカチャ。とずらす方法が見つかりません。 画像を変えるには、ロールオーバーで画像を変えるジャバスクリプトの方法しかないでしょうか? 右下にカチャ。っとずらしたいのですが。できないでしょうか。

    • 締切済み
    • CSS
  • メニューから色取得

    使用ソフト[visual c++] 初心者でわからないのですが、画面をクリックするとその場所にTextoutで出力するようにしたのですが、この文字をメニューから色を選択し、その色で表示できるようにしたいのですがわかりません。 お願いします。