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

回答編集履歴

1

サンプルコード追記

2016/05/08 11:09

投稿

catsforepaw
catsforepaw

スコア5944

answer CHANGED
@@ -3,4 +3,36 @@
3
3
  input[1]とinput[2]に値を設定するところでSleepを挟んだりしていませんか? input配列に設定した内容は`SendInput`関数実行時に一括で処理されます。
4
4
  `mi.time`はウェイト時間ではなく「タイムスタンプ」ですが、何を基準にしているのかは判りません(リファレンスにも書かれていません)。とりあえず0のままにしておくのが無難です。
5
5
 
6
- そのため、ウェイトを入れたい場合は、SendInputを複数回に分けて実行し、その間でSleepさせるようにします。
6
+ そのため、ウェイトを入れたい場合は、SendInputを複数回に分けて実行し、その間でSleepさせるようにします。
7
+
8
+ ---
9
+ 追記
10
+ ドラッグアンドドロップのサンプルコードです。
11
+ マウスカーソルの移動はわざわざ`SendInput`を使わずに`Cursor.Position`で行った方が簡単です。
12
+ ```C#
13
+ INPUT[] input = new INPUT[1];
14
+ input[0].type = INPUT_MOUSE;
15
+
16
+ // ドラッグ位置に移動
17
+ Cursor.Position = new Point(480, 220);
18
+
19
+ // マウス左ボタン押す
20
+ input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
21
+ SendInput(1, input, Marshal.SizeOf(input[0]));
22
+
23
+ // ちょっと間を置いて
24
+ Thread.Sleep(100);
25
+ // 少しずらして
26
+ Cursor.Position = new Point(500, 210);
27
+ // ちょっと間を置いて
28
+ Thread.Sleep(100);
29
+ // ドロップ位置に移動
30
+ Cursor.Position = new Point(800, 950);
31
+
32
+ // ウェイトを入れて
33
+ Thread.Sleep(1000);
34
+
35
+ // マウス左ボタン離す
36
+ input[0].mi.dwFlags = MOUSEEVENTF_LEFTUP;
37
+ SendInput(1, input, Marshal.SizeOf(input[0]));
38
+ ```