C#のフォームアプリケーションで
クリックした座標の地点のRGB値を取得したいと思っています。
イメージ画像はAviUtlの拡張編集プラグインです。
このソフトはクリックしたあらゆる画面上の地点のRGB値を取得する機能を持っています。
これと同じものを私のソフトでも実装したいということです。
方法としては
Graphics::CopyFromScreenで画面のスクリーンショットを撮り、
Bitmap::GetPixelで生成したスクリーンショット上の指定した地点の色から
Colorクラスのインスタンスを生成する
というのを考えています。
しかし、最初の画面のスクリーンショットを撮るという処理ができません。
フォーム外にマウスがあるときにマウスの座標を取得することができないからです。
どのようにすれば実装することができるのでしょうか。
追記
コード載せておきます
C#
1// てきとーにusing文 2using System; 3using System.Drawing; 4using System.Windows.Forms; 5 6// Win32APIを使用するのに必要 7using System.Runtime.InteropServices; 8 9// てきとーに省略 10// (てきとーなクラス内に記述) 11private int R, G, B; 12private Timer timer = null; 13 14private void hoge() 15{ 16 // タイマー 17 timer = new Timer(); 18 timer.Interval = 50; 19 20 // てきとーなタイミングでタイマースタート 21 timer.Start(); 22 23 // 定期的に呼ばれる処理 24 timer.Tick += (object sender, EventArgs e) => 25 { 26 // マウスの左ボタンがクリックされたら 27 if (isLButtonDown()) 28 { 29 // マウスカーソルの絶対座標 30 int x = Control.MousePosition.X; 31 int y = Control.MousePosition.Y; 32 33 // RGB値を抜き出す処理 34 pickupPixelColor(x, y); 35 36 /* 37 処理が完了したので 38 タイマーをStopするなり、 39 他の処理を書くなり 40 てきとーにする 41 */ 42 } 43 } 44} 45 46// Win32APIの使用 (catsforepawさんのコード) 47[DllImport("user32.dll")] 48private static extern short GetKeyState(int nVirtKey); 49 50// マウス左ボタンが押されているかどうかをチェック 51private bool isLButtonDown() 52{ 53 // 押された状態だと最上位ビットが1になるので、負数かどうかで判定可能 54 return GetKeyState(0x01) < 0; 55} 56 57// 指定した画面上の座標のRGB値を取得する 58private void pickupPixelColor(int x, int y) 59{ 60 // 1x1のサイズのBitmapを生成する 61 Bitmap bitmap = new Bitmap(1, 1); 62 63 // 先ほどのBitmapを元にGraphicsを生成する 64 Graphics graphics = Graphics.FromImage(bitmap); 65 66 // Bitmapに指定座標のスクリーンショットをコピーする 67 graphics.CopyFromScreen(new Point(x, y), new Point(0, 0), new Size(1, 1)); 68 69 // BitmapからColorのインスタンスを取得する 70 Color color = bitmap.GetPixel(0, 0); 71 72 // RGB値を保存する 73 R = color.R; 74 G = color.G; 75 B = color.B; 76}

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/01/27 21:09
2016/01/27 22:54
2016/01/28 10:10 編集