質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

4046閲覧

C#でDragDrop

startnote

総合スコア24

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/05/07 14:02

こんにちは。いつもお世話になります。
http://homepage3.nifty.com/midori_no_bike/CS/userIO.html
を参考に、マウスの自動操作をしようとしています。

これで、ドラッグ操作をしたいと考えています。
困っているのは、「dragdropでドロップ先でウエイトしたい」ことがあるのです。
drop時にある程度時間をかけないと、認識してくれないことがあるためです。

input[1]とinput[2]のあいだで、Thread.Sleep(1000)とかしてみたのですが、うまくいきませんでした。
input[1].mi.timeというのがあるので、これを、
input[1].mi.time = 1000;
と設定してみても変化なしでした。

なにか方法をご存じありませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

iwamoto_takaaki

2016/05/07 15:42

うまくいかなかったとは具体的にどのような状況でしょうか。 問題点を記述する際は、期待したこと、実際に起こったことを具体的に書くとアドバイスしやすいです。
guest

回答2

0

的外れかもしれませんが、WM_XXイベントが処理されていないだけではないでしょうか?
SendInputでも何でも、マウス操作をする処理の後(Sleepの後)に
Application.DoEvents
を入れるとどうでしょうか?

また、そもそも(無いとは思いますが)評価先のアプリがDnDを受け付けない設定になっているとかは無いでしょうか?フリーソフトの自動操作アプリでは問題無く実現可能というのは検証済でしょうか?

投稿2016/05/08 23:13

skltn00

総合スコア31

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

startnote

2016/05/11 15:35

返事が遅くなり失礼しました。 いろいろアイデアを出していただき感謝します。 下記のようにイベントをわけることで成功しました。 評価先のアプリケーションはDragDropを受けます。さすがにそれは大丈夫です。
startnote

2016/05/11 15:36

困っているときはいろいろなことで困っているので、的外れでもなんでも、アイデアを出していただけることにはとても感謝します。なにがきっかけで解決するかはよくわからないので…。
guest

0

ベストアンサー

input[1]とinput[2]のあいだで、Thread.Sleep(1000)とかしてみたのですが、うまくいきませんでした。

input[1]とinput[2]に値を設定するところでSleepを挟んだりしていませんか? input配列に設定した内容はSendInput関数実行時に一括で処理されます。
mi.timeはウェイト時間ではなく「タイムスタンプ」ですが、何を基準にしているのかは判りません(リファレンスにも書かれていません)。とりあえず0のままにしておくのが無難です。

そのため、ウェイトを入れたい場合は、SendInputを複数回に分けて実行し、その間でSleepさせるようにします。


追記
ドラッグアンドドロップのサンプルコードです。
マウスカーソルの移動はわざわざSendInputを使わずにCursor.Positionで行った方が簡単です。

C#

1INPUT[] input = new INPUT[1]; 2input[0].type = INPUT_MOUSE; 3 4// ドラッグ位置に移動 5Cursor.Position = new Point(480, 220); 6 7// マウス左ボタン押す 8input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; 9SendInput(1, input, Marshal.SizeOf(input[0])); 10 11// ちょっと間を置いて 12Thread.Sleep(100); 13// 少しずらして 14Cursor.Position = new Point(500, 210); 15// ちょっと間を置いて 16Thread.Sleep(100); 17// ドロップ位置に移動 18Cursor.Position = new Point(800, 950); 19 20// ウェイトを入れて 21Thread.Sleep(1000); 22 23// マウス左ボタン離す 24input[0].mi.dwFlags = MOUSEEVENTF_LEFTUP; 25SendInput(1, input, Marshal.SizeOf(input[0]));

投稿2016/05/07 15:52

編集2016/05/08 11:09
catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

startnote

2016/05/08 09:58

// モニタの解像度を取得 int primaryScreenWidth = Screen.PrimaryScreen.Bounds.Width; int primaryScreenHeight = Screen.PrimaryScreen.Bounds.Height; Cursor.Position = from; // ドラッグ操作の準備 (struct 配列の宣言) const int NUM_INPUT = 2; INPUT[] input = new INPUT[NUM_INPUT]; // 計2イベントを格納 // ドラッグ操作の準備 (第1イベントの定義 = 左ボタン Down) input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN; // ドラッグ操作の準備 (第2イベントの定義 = 絶対座標へ移動) input[1].mi.dx = (to.X * SCREEN_LENGTH) / primaryScreenWidth; input[1].mi.dy = (to.Y * SCREEN_LENGTH) / primaryScreenHeight; input[1].mi.dwFlags = MOUSEEVENTF_MOVED | MOUSEEVENTF_ABSOLUTE; // ドラッグ操作の実行 (計2イベントの一括生成) SendInput((uint)input.Length, input, Marshal.SizeOf(input[0])); Thread.Sleep(3000); // click操作の準備 (struct 配列の宣言) INPUT[] mouseupinput = new INPUT[1]; // 計1イベントを格納 // ドラッグ操作の準備 (第3イベントの定義 = 左ボタン Up) mouseupinput[0].mi.dwFlags = MOUSEEVENTF_LEFTUP; // ドラッグ操作の実行 (計2イベントの一括生成) SendInput(1, mouseupinput, Marshal.SizeOf(mouseupinput[0])); MessageBox.Show("finish!"); ありがとうございます。 早速上記のように、コードを変更してみたのですが、依然としてドラッグできずにいます。 ポインタは移動していて、ドラッグ後に終了のMessageBoxも表示しているので、プログラムじたいは実行できている模様です。 コードはよさそうなのですが、ドラッグ&ドロップは動作していません。
catsforepaw

2016/05/08 11:07

左ボタン押下と同時にマウスカーソルを移動させているので、もしかしたらうまくつかんでいないのかもしれません。人が操作するのと同じように、アクション毎にウェイトを入れた方が無難です。 キー入力やマウスの自動制御によるUI操作は結構試行錯誤が必要です。 試しに作ったサンプルコードを回答の方に追記します。参考にしてみてください。
startnote

2016/05/11 15:33

返事が遅くなり失礼しました。 ご示唆いただいた方法でできました! 検証するのにだいぶ手間どってしまいました。 ありがとうございます。感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問