C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 処理のタイミングについて


(過去ログ 10 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■2080 / inTopicNo.1)  処理のタイミングについて
  
□投稿者/ 終 (1回)-(2007/03/16(Fri) 23:33:47)

分類:[C# (Windows)] 

2007/03/16(Fri) 23:36:48 編集(投稿者)
自動でキー入力をするツールを作っているのですが、一つ質問させてください。
説明のために簡略化したソースです:

    // A
    win32api.keybd_event((byte)charA, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charA, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

    Clipboard.SetDataObject(textBox1.Text);

    // Ctrl + V
    win32api.keybd_event((byte)Keys.ControlKey, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charV, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charV, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    win32api.keybd_event((byte)Keys.ControlKey, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

    // B
    win32api.keybd_event((byte)charB, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charB, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

    // C
    win32api.keybd_event((byte)charC, 0, 0, (UIntPtr)0);
    win32api.keybd_event((byte)charC, 0, 2/*KEYEVENTF_KEYUP*/, (UIntPtr)0);
    Thread.Sleep(500);

順当に処理されれば、「A → 貼り付け → B → C」が0.5秒間隔で入力されるはずなのですが、
「A →(1.5秒)→ 貼り付け&B&C」と、後半が同時に入力されてしまいます。
これで、

    Clipboard.SetDataObject(textBox1.Text);

か、もしくは

    // Ctrl + V

の部分のどちらかが無ければ、0.5秒間隔でテンポ良く入力されるのですが、
両方がある状態だとどうもうまくいかないようです。

ひょっとすると初歩的なことなのかもしれませんが、
どうにもお手上げ状態のため、どなたかご教示頂けましたら幸いです。
どうぞよろしくお願い致します。(_ _)

引用返信 編集キー/
■2087 / inTopicNo.2)  Re[1]: 処理のタイミングについて
□投稿者/ よねKEN (20回)-(2007/03/17(Sat) 16:03:07)
よねKEN さんの Web サイト
何のアプリをアクティブにしてキー入力しているのでしょうか?
キー入力のメッセージをどのように処理するか?は受け側のアプリ側次第ですので、
タイミングの調整は難しいかもしれません。

例えば、他のアプリではなく、自分のアプリのテキストボックスに
キー入力させるとどうなるでしょうか?
提示のコードがbutton1のClickイベントに記述してあるとして、
textBox2にキー入力させようとすると、0.5秒間隔で表示されずに
たぶん一気にすべてのキー入力が表示されると思います。

button1をクリックしたときに提示の処理が走りますので、
その処理中にはtextBox2側でキー入力に対して処理できません。
そのため、button1のクリックの処理後に一気に入力された文字が表示されます。

つまり、相手側のアプリが何らかの処理でビジーになると
すぐにはキー入力の結果は反映されません。
#そのアプリはCtrl+Vの処理で忙しくなっているんではないかなと予想されます。

引用返信 編集キー/
■2100 / inTopicNo.3)  Re[2]: 処理のタイミングについて
□投稿者/ 終 (2回)-(2007/03/18(Sun) 21:42:52)
2007/03/18(Sun) 21:45:34 編集(投稿者)

ご回答ありがとうございます。
実行時にアクティブにしていたアプリは、通常のテキストエディタです。
ちなみにご指摘の通り、このアプリ内のtextBox内への表示に対しても
順序に関する似たような問題が発生しております。

#キー入力シミュレートが始まる前に表示させたいのに、実際には
#全てのキー入力処理が終わった瞬間にようやく表示される

確かにビジー状態に陥ってるような雰囲気ですが、ウェイトをかけるのに
Thread.Sleep()を使用しているのがマズイのでしょうか。
何か良い回避方法はありますでしょうか。。

よろしくお願い致します。(_ _;

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -