OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

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

  • 暇なときにでも
  • 質問No.199357
  • 閲覧数2761
  • ありがとう数7
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 84% (27/32)

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

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

 API関数等を使用するのでしたらどういう関数を使用すればよいか教えてください。
 よろしくお願いします。
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.5
レベル12

ベストアンサー率 65% (276/422)

># 反論~にどうぞ。
(゜ .゜)ノ カンシャ デス
真意をわかっていただいて、うれしいです。^^


サンプルです。

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

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

お礼率 84% (27/32)

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

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

その他の回答 (全4件)

  • 回答No.1
レベル12

ベストアンサー率 65% (276/422)

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

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

操作はSendMessageで行い、その操作対象のハンドルを得て処理を行うようにしましょう。
お礼コメント
chupark

お礼率 84% (27/32)

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


  • 回答No.2
レベル13

ベストアンサー率 59% (729/1235)

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

AppActivateとSendKeysで出来ます
お礼コメント
chupark

お礼率 84% (27/32)

 早速のご回答ありがとうございます。
 簡単に使うならばAPIを使うまでもないというご意見ですね?
 AppActivateとは知りませんでした。
 大変参考になります。
投稿日時 - 2002-01-16 21:51:43
  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

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でのσ( ̄ー ...続きを読む
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

お礼率 84% (27/32)

 Sendkeysは知ってはいましたが、あまり使ったことがなかったのですが、あまり多発・多用すると環境によっては厳しい場合があるということですね?
 こちらも非常に参考になります。
 重ねてありがとうございます。
投稿日時 - 2002-01-16 21:55:06
  • 回答No.4
レベル13

ベストアンサー率 59% (729/1235)

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

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

さて、BN_CLICKEDをSendMessageする方法はよさそうだが、
昔挫折した憶えが。。。
よろしければ、具体的に教えていただきたい。
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ