プロが教えるわが家の防犯対策術!

 VBを使って他の既存のソフトなどへ何らかの命令をかけることは可能でしょうか?
 
 具体的には起動中のほかのアプリケーションへキー操作をさせる…というようなことは可能でしょうか?

 たとえば、コマンドを設置しておいて、そのコマンドをクリックすると起動中の別のアプリケーション上でEnterキーを押した状態を引き起こさせるというようなことです。
 
 また、それとは逆に他のアプリケーションを監視して、キーが押されたときに反応させるというようなことは可能でしょうか?

 API関数等を使用するのでしたらどういう関数を使用すればよいか教えてください。
 よろしくお願いします。

A 回答 (5件)

># 反論~にどうぞ。


(゜ .゜)ノ カンシャ デス
真意をわかっていただいて、うれしいです。^^


サンプルです。

このサンプルを実行するには二つのプロジェクトが必要となります。

Project1
└Form1
  ├Command1
  └Command2
'Form1の中身
Option Explicit

Private Sub Command1_Click()
  MsgBox 1
End Sub

Private Sub Command2_Click()
  MsgBox 2
End Sub
と記載して、ボタンが押されたらメッセージボックスを表示するようにしておきます。
これをEXEにして起動しておいてください。



Project2
└標準モジュール
'標準モジュールの中身
Option Explicit

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_COMMAND = &H111
Private Const BN_CLICKED = &H0&

Sub Main()
  Dim lngWindWnd As Long 'ウィンドウハンドル
  Dim lngBtnWnd1 As Long '最初に見つかったボタン
  Dim lngBtnWnd2 As Long '2番目に見つかったボタン
  
  
  'アプリケーションタイトルより、ウィンドウハンドル得ます
  lngWindWnd = FindWindow(vbNullString, "Form1")
  
  
  '指定のウィンドウハンドル内の、最初に見つかったクラス名[ThunderRT6CommandButton](VB6で作成したコマンドボタン)のハンドルを得ます
  '【注意:2番目の引数が0(Nullポインタ)のとき、最初に見つかったものを返すように指定している】
  lngBtnWnd1 = FindWindowEx(lngWindWnd, 0, "ThunderRT6CommandButton", vbNullString)
  Call SendMessage(lngWindWnd, WM_COMMAND, BN_CLICKED, ByVal lngBtnWnd1)
  
  
  '指定のウィンドウハンドル内の、2番目に見つかったクラス名[ThunderRT6CommandButton](VB6で作成したコマンドボタン)のハンドルを得ます
  '【注意:2番目の引数が0以外(Nullポインタではない)とき、2番目のパラメータ以降に見つかったハンドルを返すように指定している】
  lngBtnWnd2 = FindWindowEx(lngWindWnd, lngBtnWnd1, "ThunderRT6CommandButton", vbNullString)
  Call SendMessage(lngWindWnd, WM_COMMAND, BN_CLICKED, ByVal lngBtnWnd2)
End Sub




といった感じです。
一番最初にサンプルを載せたかったのですが、ちょっと納期前ということで、説明を簡略化してしまいました。


>一文字(Enterキー)を渡すだけならSendKeysでも問題はないかな..
たしかにそうですね。。。
話を戻しますが、#3で書いた電子電○帳と連携したソフトですが、目的のボタンにたどりつくために、[TAB]を数回送った後に[ENTER]を送っていました。最初から目的のボタンにフォーカスがあるのであれば、全然問題ないのですが、、、

なので、処理によってはSendkeysで十分だと思いますが、2回以上のSendkeysが連続するようなのであれば、OSの状況に影響されないAPIを使うことをお奨めします。
    • good
    • 1
この回答へのお礼

 サンプルコードありがとうございます。

 今回、特に急いでいるわけでもなく、前々から疑問だったことをこの場で質問してみたのですが、大変参考になるご意見をお二人からいただけて非常に感激しております。
 まとまった時間を空けて、ゆっくり試してみたいと思います。

お礼日時:2002/01/16 22:00

# 反論はOKだと思います。


# 遠慮せずにどうぞ。

一文字(Enterキー)を渡すだけならSendKeysでも問題はないかな..
というのが私の見解です。

さて、BN_CLICKEDをSendMessageする方法はよさそうだが、
昔挫折した憶えが。。。
よろしければ、具体的に教えていただきたい。
    • good
    • 1

Todo36さんに申し訳ないのですが・・・・(いつもお世話になってます)


SendKeysはお奨めいたしません。。。

URLを見てください。

http://oshiete1.goo.ne.jp/kotaeru.php3?q=110224
#2でのjosyo_mさんの発言

http://oshiete1.goo.ne.jp/kotaeru.php3?q=157242
#2でのσ( ̄ー ̄ ボク の 発言


以前に電子電○帳と連携した、VB製の住所録入力管理ソフトを触れた経験があります。
電話番号を入力後、ボタンをクリック(エンター)するとSendKeysで処理を行って、別ソフトから住所を得るというものでしたが、PCの低スペックと操作する人の慣れから、ソフト側が操作の早さについていけず、予期せぬエラーが連発していました。

ですので・・・・というわけです。


(この発言は、個人を攻撃しているわけではありません。むしろTodo36さんの発言は常にチェックして、スキルアップにつながってますので、感謝してます。)
    • good
    • 1
この回答へのお礼

 Sendkeysは知ってはいましたが、あまり使ったことがなかったのですが、あまり多発・多用すると環境によっては厳しい場合があるということですね?
 こちらも非常に参考になります。
 重ねてありがとうございます。

お礼日時:2002/01/16 21:55

>具体的には起動中のほかのアプリケーションへキー操作をさ


>せる…というようなことは可能でしょうか?

AppActivateとSendKeysで出来ます

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

 早速のご回答ありがとうございます。
 簡単に使うならばAPIを使うまでもないというご意見ですね?
 AppActivateとは知りませんでした。
 大変参考になります。

お礼日時:2002/01/16 21:51

FindWindow :目的のアプリケーションを探す


FindWindowEx:目的のアプリケーション内の、目的のコマンドボタンなどのコントロール類を探す
SendMessage ;見つかった目的のコントロールを制御する(送るメッセージ:BN_CLICKED = 0&)

基本はこれらの関数です。

操作はSendMessageで行い、その操作対象のハンドルを得て処理を行うようにしましょう。
    • good
    • 0
この回答へのお礼

 すばやい回答ありがとうございます。
 まだ試してみてないのですが、FindWindowは使えそうな気がします。
 実は、この機能も探し求めていたものかもしれませんので。
 
 早速、調べながら試してみたいと思います。

お礼日時:2002/01/16 21:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A