1秒毎に勝手にボタンが反応するプログラム

タグの編集
投稿者 C#の人  (社会人) 投稿日時 2009/3/31 02:15:52
お世話になります。
使用言語:VB6.0

自分で思いついたプログラムを簡単に作成しようと
独学で勉強を始めました。

現在作成しようとしている物は、本当に簡単な物で
ボタンが押されると1秒毎にキーボード(仮にAとします)が
押されるプログラムを作成しようとしています。
ですが、私が作成したプログラムじゃどうやら思ったように動作しないので、
お知恵をお借りしたいと思います。

1,フォームにコマンドボタンとTimer関数を張り付ける。
2,ロード時にTimer関数のintervalを1000に設定し、EnableをFalseに設定する。
3,フラグを持たせボタンが押された時にON/OFFの判断をさせ、ON持にEnableをTrueに
 OFF時にEnableをFalseにする。
4,Timer関数の中にKeyPress(A)の処理を書く。


3までは出来ているのですが、4以降の処理が正しくないのだと思います。
判りづらい質問で恐縮ですが宜しくお願い致します。

以上です。
投稿者 葉月  (社会人) 投稿日時 2009/3/31 07:51:55
VB6.0のことはわかりませんが、KeyPressということはイベントですよね。
そうなると、使い方がおかしいように感じます。
KeyPressイベントは、ユーザーがキーを押した時に動くコードです。
一定時間、経過したら動くイベントではありません。

恐らく、SendKeysを使って行うようになると思います。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2009/3/31 13:19:25
> 1,フォームにコマンドボタンとTimer関数を張り付ける。
それを言うなら、「Timer コントロール」ですね。
「Timer 関数」だと、「深夜零時からの経過秒数を求める関数」になってしまいます。

> 4,Timer関数の中にKeyPress(A)の処理を書く。
それを言うなら、Timer コントロールの「Timer イベント」ですね。
どれも "Timer" の名前で混同しそうですが、それぞれ別物なので用語の使い分けに御注意を。


> ボタンが押されると1秒毎にキーボード(仮にAとします)が
> 押されるプログラムを作成しようとしています。
"A" のキーが押されたことにしたい、という事ですね。

ではそのキーを、どこに、そして何のために送出したいのでしょうか?
その目的によって、適切なコードも難易度も変わってくるかと思います。

たとえば、自身の TextBox に A の文字を書き込みたいだけなら、
 Text1.SelText = "A"
などと書けます。自分以外のアプリの TextBox に送りつけたいのであれば、
少々手間がかかりますが、API で WM_SETTEXT メッセージを送ることで
実装することができます。あるいは Excel のセルに書き込みたいなら、
オートメーションあるいは DDE という手法を使うのが定番です。


その他、SendKeys ステートメントや SendInput API というものなどを利用して、
キー入力をアプリに送出するといった方法も使えるかも知れません。
http://hanatyan.sakura.ne.jp/vbhlp/SendInput.htm
http://hanatyan.sakura.ne.jp/vbhlp/keybdeve.htm
ただし、このキー操作を再現するという手法の場合、操作対象のウィンドウが
アクティブな状態になっていなければならないという制限を受けます。

そのため、下記の VB6 サンプルのように、アクティブにならないフォームを作ったり
http://msdn.microsoft.com/ja-jp/library/cc440905.aspx
あるいは、キーストロークを送出する直前に、AppActivate ステートメントなどを
使って、アクティブなウィンドウを切り替えるといった作業が必要となります。また、
そのアプリのどのコントロールに対して送りつけたいのかも重要になってくるかと思います。

もっとも、今回は 1秒間のタイマーを併用しているようですので、その1秒間の間に
ユーザーに手作業でウィンドウを切り替えてもらうだけでも良いかも知れませんけれども。


なお、VB6 の SendKeys ステートメントを使った方法の場合、DirectInput を
使ったアプリに対しては通用しないかと思います。また、お使いの OS がもしも
Vista 環境なのだとしたら、開発環境からではなく、EXE から実行しなければ
ならない点にも注意が必要です。何故ならば、デバッグ実行からでは
「実行時エラー '70': 書き込みできません。」になってしまうからです。
(SendKeys ステートメントの代わりに、SendInput API を使えば、
開発環境からの実行も行えますけれどね)

より低レベルな話だと:
http://vsug.jp/tabid/63/forumid/45/postid/1344/view/topic/Default.aspx
投稿者 C#  (社会人) 投稿日時 2009/3/31 18:07:15
返答有難うございます。
イベントの使い分けが出来ていないようなので、
もう少し詳しく調べたいと思います。

現状暇な時間があったら作る程度なので気長に作ろうかと思います。
まだ判らない部分が出てきたら質問させて頂きます。

皆さん有難うございました。
投稿者 C#  (社会人) 投稿日時 2009/3/31 22:41:36
教えて頂いた通り、SendKeysステートメントを使用する事によって
実装が可能になりました。
教えてくださった方々有難うございました。

ちなみに疑問に思ったので再度質問させて頂きたいのですが、
1秒毎に左クリックするという方法だとどうなるのでしょうか?
調べてみたのですがイマイチ判りません・・・。

宜しくお願い致します。
投稿者 neptune  (社会人) 投稿日時 2009/3/31 23:17:42
こんにちは


>1秒毎に左クリックするという方法だとどうなるのでしょうか?
commandをクリックするということなら、
SendInput APIでも出来るだろうし、
command=true
とやっても、できます。

TimerコントロールのTimerイベントに↑を書くと決まった時間毎に処理できます。
が、一定時間ごとにクリックするより、クリック時と同じ処理をするなら
別関数としておきcommand、Timerイベントで同じ関数を呼ぶ方がわかり易いのでは?
投稿者 C#  (社会人) 投稿日時 2009/4/1 01:33:09
返答有難うございます。

今現在どうしたい等の事はなく、出来るかな?程度の質問でしたので、
どの様なアプリを作成していくかは今後の話になる予定です。

皆さん色々と教えて頂きありがとうございました。
教えて頂いたことを調べ、頑張ろうと思います。