こんにちは。いつもお世話になります。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
的外れかもしれませんが、WM_XXイベントが処理されていないだけではないでしょうか?
SendInputでも何でも、マウス操作をする処理の後(Sleepの後)に
Application.DoEvents
を入れるとどうでしょうか?
また、そもそも(無いとは思いますが)評価先のアプリがDnDを受け付けない設定になっているとかは無いでしょうか?フリーソフトの自動操作アプリでは問題無く実現可能というのは検証済でしょうか?
投稿2016/05/08 23:13
総合スコア31
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総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/08 09:58
2016/05/08 11:07
2016/05/11 15:33
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。