質問: color.B; } ```
回答: 方法としては3種類くらい思いつきます。 1現在のマウスカーソル位置を示すプロパティ値を取得 2全画面を取り込んで全画面サイズの縁なしフォームで最前面に表示 3自分のフォームでマウスをキャプチャーし、フォーム外のマウスイベントも拾えるようにする 1は単純に`Cursor.Position`の値を使えば良いですが、クリックイベントなどが拾えないので使いづらいですね。 却下。 2はなんとなくいけそうな気がしますが、別ウインドウでの操作になってしまい、マウスドラッグ中の色をどうやって表示させるのかという問題が出てきますね。 却下。 3`this.Capture = true;`とやると、それ以降のマウスイベントがすべてthisフォームに送られます。これだとフォーム外のマウスイベントを拾うことができます。その間の`MouseMove`イベントで渡される座標は当然クライアント座標なので、スクリーン座標に変換するか`Cursor.Position`でスクリーン座標を取得します。 解除は`this.Capture = false;`です。 おそらく、AviUtlもこの方法を使っていると思われます。 ※マウスキャプチャーはボタンを押している間しか効果がないので、操作方法としては、スポイトアイコンを押したらそのままボタンを離さずに画面をなぞって色を取り込み、ボタンを離したらその位置で確定させる、というような感じになると思います。 追記 参考にしているAviUtlがどのような挙動なのかインストールして確かめてみました。 どうやら当初考えていたのとは違ったようです。スポイトボタンを押したらボタンを離した状態でデスクトップ上の任意の場所をポイントしてクリックで取り込んでいますね。 なんとなく判りました。おそらく、マウスイベントをハンドリングするのではなく、Win32 APIの`GetKeyState`関数でリアルタイムにマウスボタンの状態を監視し、押された時点でその場所の色を取り込む、ということをしていますね。 ちょっと面倒です。 ``` [DllImport("user32.dll")] private static extern short GetKeyState(int nVirtKey); private static const int VK_LBUTTON = 0x01; // マウス左ボタンの仮想キーコード // マウス左ボタンが押されているかどうかをチェック private static bool isLButtonDown() { return GetKeyState(VK_LBUTTON) < 0; // 押された状態だと最上位ビットが1になるので、負数かどうかで判定可能 } ``` 10~20ミリ秒間隔のタイマーイベントで上記メソッドを使ってマウス左ボタンが押されているかどうかを監視し、押されたらその時点のマウスカーソル座標を取得してその場所をスクリーンキャプチャして取り込む、という方法でできます。