• ベストアンサー

他のアプリケーションとの連携

 VBを使って他の既存のソフトなどへ何らかの命令をかけることは可能でしょうか?    具体的には起動中のほかのアプリケーションへキー操作をさせる…というようなことは可能でしょうか?  たとえば、コマンドを設置しておいて、そのコマンドをクリックすると起動中の別のアプリケーション上でEnterキーを押した状態を引き起こさせるというようなことです。    また、それとは逆に他のアプリケーションを監視して、キーが押されたときに反応させるというようなことは可能でしょうか?  API関数等を使用するのでしたらどういう関数を使用すればよいか教えてください。  よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.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を使うことをお奨めします。

chupark
質問者

お礼

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

その他の回答 (4)

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.4

# 反論はOKだと思います。 # 遠慮せずにどうぞ。 一文字(Enterキー)を渡すだけならSendKeysでも問題はないかな.. というのが私の見解です。 さて、BN_CLICKEDをSendMessageする方法はよさそうだが、 昔挫折した憶えが。。。 よろしければ、具体的に教えていただきたい。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.3

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さんの発言は常にチェックして、スキルアップにつながってますので、感謝してます。)

chupark
質問者

お礼

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

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

>具体的には起動中のほかのアプリケーションへキー操作をさ >せる…というようなことは可能でしょうか? AppActivateとSendKeysで出来ます

参考URL:
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vastmsendkeysx.htm
chupark
質問者

お礼

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

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.1

FindWindow :目的のアプリケーションを探す FindWindowEx:目的のアプリケーション内の、目的のコマンドボタンなどのコントロール類を探す SendMessage ;見つかった目的のコントロールを制御する(送るメッセージ:BN_CLICKED = 0&) 基本はこれらの関数です。 操作はSendMessageで行い、その操作対象のハンドルを得て処理を行うようにしましょう。

chupark
質問者

お礼

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

関連するQ&A