質問するログイン新規登録

回答編集履歴

1

追記

2016/01/27 23:06

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -14,4 +14,28 @@
14
14
  解除は`this.Capture = false;`です。
15
15
  おそらく、AviUtlもこの方法を使っていると思われます。
16
16
 
17
- ※マウスキャプチャーはボタンを押している間しか効果がないので、操作方法としては、スポイトアイコンを押したらそのままボタンを離さずに画面をなぞって色を取り込み、ボタンを離したらその位置で確定させる、というような感じになると思います。
17
+ ※マウスキャプチャーはボタンを押している間しか効果がないので、操作方法としては、スポイトアイコンを押したらそのままボタンを離さずに画面をなぞって色を取り込み、ボタンを離したらその位置で確定させる、というような感じになると思います。
18
+
19
+ ---
20
+ 追記
21
+ 参考にしているAviUtlがどのような挙動なのかインストールして確かめてみました。
22
+ どうやら当初考えていたのとは違ったようです。スポイトボタンを押したらボタンを離した状態でデスクトップ上の任意の場所をポイントしてクリックで取り込んでいますね。
23
+
24
+ なんとなく判りました。おそらく、マウスイベントをハンドリングするのではなく、Win32 APIの`GetKeyState`関数でリアルタイムにマウスボタンの状態を監視し、押された時点でその場所の色を取り込む、ということをしていますね。
25
+
26
+ ちょっと面倒です。
27
+
28
+ ```C#
29
+ [DllImport("user32.dll")]
30
+ private static extern short GetKeyState(int nVirtKey);
31
+
32
+ private static const int VK_LBUTTON = 0x01; // マウス左ボタンの仮想キーコード
33
+
34
+ // マウス左ボタンが押されているかどうかをチェック
35
+ private static bool isLButtonDown()
36
+ {
37
+ return GetKeyState(VK_LBUTTON) < 0; // 押された状態だと最上位ビットが1になるので、負数かどうかで判定可能
38
+ }
39
+ ```
40
+ 10~20ミリ秒間隔のタイマーイベントで上記メソッドを使ってマウス左ボタンが押されているかどうかを監視し、押されたらその時点のマウスカーソル座標を取得してその場所をスクリーンキャプチャして取り込む、という方法でできます。
41
+