• ベストアンサー

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

 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

  • 他のアプリケーションの終了処理

    Shell関数を使って起動した他アプリケーションを 今度はその、他アプリケーションからではなく、V Bで作成したメイン画面の終了と同時に終了させた いのですが方法、又は適切な文法が分かりません。 よろしくお願いします。 ※ちなみにVBで作成したメイン画面の終了と同時 に終了させたい他アプリケーションは1つだけです。 しかも決まったパスに置いていて、この先もずっと 固定です。条件としては以上です。

  • (vba)他のアプリケーションの右ctrlキーを押すには?

    excelのvbaを使って、他のアプリケーション(3270エミュレータ)上で、実行キーに割り当てられている「右ctrlキー」または「テンキーのenterキー」を押すようにしたくて、sendkeys "^"やsendkeys "{enter}"を使ってみましたが、うまくいきません。どうしたら良いでしょうか?

  • 別アプリケーションの操作

    こんにちは。 タイトルの件についてお聞きしたいことがあるのでよろしくお願いします。 既存のVB.netアプリケーションがあります。 ログイン画面があるのですが、毎回入力するのが面倒なので、自動ログインツールを作成しようと思っています。 ツール側もVB.netです。 そこで、別のアプリケーションのテキストボックスやコマンドボタンの操作というのはどのようにしたらいいのでしょうか? 既存アプリケーション側は変更したくありません。 どなたかアドバイスよろしくお願いします。

  • 他のアプリからVBのFormへフォーカスを戻したい。

    「他のアプリケーションにフォーカスがある場合に、 ショートカットキー(例:Ctrl+a)を押すと、 VBのFormへフォーカスが移る」ということをVBでプログラムしたいのですが、APIを使うのでしょうか? VBのイベントなどを使用したプログラミングの経験はあるのですが、APIの使い方は分かりません。 どなたか教えてください。よろしくおねがいします。

  • VBに既存のアプリケーションを組み込むには?

    VBに既存のアプリケーションを組み込むことは可能なのでしょうか? あらかじめパソコンにアプリケーションがインストールされてあれば呼び出せることができますが、インストールされていなかったらどのようにして組み込めばいいのですか? 例)コマンドボタンを押したらゲーム(ベクターで配られている無料)がひらく等・・ ゲームをインストールしてから自作のVBアプリをインストールしていては2度でまなので1度で済ませたいのですが可能でしょうか? よろしくお願いしますm( _ _ )m -------------------------------------- 環境はVB6です OSはXPProです

  • 他アプリケーションの終了

    Shell関数を使って起動した他アプリケーションを 今度はその、他アプリケーションからではなく、V Bで作成したメイン画面の終了と同時に終了させた いのですが方法、又は適切な文法が分かりません。 よろしくお願いします。

  • VisualBasic2008を使用してます。既存ソフトの制御について質問です。 

    VisualBasic2008使って、他の既存ソフトやアプリケーションの制御をする事は可能でしょうか? 具体的には、起動中の他アプリケーションへキーボード操作(EnterキーやSpaceキー等)をさせる…というような事です。 もしご存知の方がいらっしゃいましたら、よろしくお願いします。

  • キーの入力をVBで受けたいんです。

    VBで簡単な業務支援をしたいと思っています。 VBのアプリケーションがアクティブになっていなくても(起動はしてる)、あるキーの入力を感知して、VBがアクティブになりイベントが動くような処理はできないでしょうか? できればVBでやりたいのですが、Windowsの機能やAPIを使ってでもかまいませんので方法がありましたら教えてください。

  • VB.NETでの他アプリケーションのメニュー項目編集方法

    VB.NETでメモ帳の様なアプリケーションのメニュー項目(ファイル⇒開くなど)を 表示しないようにする方法としてはどのようなものがありますでしょうか? 色々調べたところ、Win32APIにて、GetMenuItemInfoやRemoveMenuを 使用して行うのかな?と思っているのですが、他に方法はありますでしょうか? 例えば、.NET Frameworkのクラスを使用するとか。。。 ご存知の方がいらっしゃいましたらご教示願えれば幸いです。 よろしくお願い申し上げます。 以上です。

  • Accessで他のアプリケーションファイルを開く方法は?

    Access2000でshell関数を使用するなどして、他のアプリケーションを起動する方法はありますが、アプリケーションを指定せずファイルだけを指定して、関連付けされたアプリケーションで開く方法はないでしょうか? (例: c:\test\sample.jpgを指定すると、関連付けされたペイントブラシが起動してファイルが開かれる)

専門家に質問してみよう