• ベストアンサー

VB.NETで他のアプリが完全に起動するまで待機する方法を教えて

VB.NET+WinXP環境なのですが、VB.NETで他のアプリを開いて MainWindowTitleでウィンドウタイトルを取得して、 それを元にFindWindowExでハンドル(Hwnd)を取得したいのですが Process.Start(ApplicationA) でアプリが完全に起動し終わる前に次の処理へ移ってしまい、 MainWindowTitleを取得する時に中身が""になってしまったり、 本来なら例えば 「Yahoo! JAPAN - Microsoft Internet Explorer」となるべきところを 「 - Microsoft Internet Explorer」の状態で取得して 次に進んでしまったりします。 起動を実行した後に、Sleep(2000)などを入れると大丈夫なのですが、 必要なSleep時間はマシンや開くアプリによって違うので不都合があります。 APIのWaitForInputIdleもHwndが取得できてからでないと使用できないようです。 恐れ入りますが、良い方法がありましたら、 ご教示頂きたく、お願い致します。

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

  • ベストアンサー
回答No.1

System.Diagnostics.Process.WaitForInputIdle() でいいんじゃないですか?

popopompom
質問者

お礼

ご回答ありがとうございます。 こちらの方法も試してみたのですが ウィンドウタイトルの取得に関しては やはり不完全になってしまうことがあるようでした。 ありがとうございました。

その他の回答 (1)

回答No.2

既存のIEをどのように操作しているかがわかりませんが、 http://okwave.jp/kotaeru.php3?q=1520064 の質問者さんが書かれているように busy を拾ったらよいと思います。

popopompom
質問者

お礼

ご回答ありがとうございます。 この方法ですと、インターネットエクスプローラでないと 対応できないようで、今回は色々なアプリに汎用的に対応できる方法を考えております。 今のところ方法はわからないのですが、何か方法はあるのだと思いますので、 WEBサイトで探してみたいとおもいます。 ありがとうございました。

関連するQ&A

  • VB.netでFindWindowExやると・・・9222812402616107008!?

    VB.netでWin32APIのFindWindowExを使うと, たとえばスタートボタンのHWNDを拾ってくるとき, 本当なら65662(6.0のSpy++で確認+10進変換)が返ってきて欲しいんですが, 9222812402616107008という,異常な数が返ってきます. Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpsz1 As String, <MarshalAs(UnmanagedType.LPTStr)> ByVal lpsz2 As String) As Long とやってあります. VB6.0のAPIビューワからコピペして,MarshalAsをつけてみました.   (初心者なので,わけわからないまま付けましたけど; hWnd_ShellTrayWnd = FindWindowEx(0,0,"Shell_TrayWnd",vbNullString) hWnd_StartButton = FindWindowEx(hwnd_ShellTrayWnd,0,"Button",vbNullString) とやってるのですが・・・. 不思議なのは,hWnd_ShellTrayWndが9222812402616238204になっているにもかかわらず,次のFindWindowExで,hWnd_StartBtnが9222812402616107008になってるところです・・・. しかも,ありえないクラス名(KeyBoadぐちゃぐちゃ押し)を指定しても,なぜか数が返ってくるんです. FindWindowExを成功させる(きちんとした数を取る)方法,またはFindWindowEx以外でhWndを拾ってくる方法,ありましたら,教えてください.

  • VB.NETからエクセルを起動して、エクセルでVBを閉じたい。

    こんにちは。 先日、エクセルのフォームを最前面に配置したいという 質問をさせて頂いたものでございます。 それで、SetWindowPosのAPIで設定する方法を教えて頂いたのですが、 最前面にする事は出来たのですが、フォームを動かすと ブックはその一つ下に現れてしまい、 ブックを最背面に配置するなどを試みてみたのですが、 どうもうまく行かないので、 エクセルから直に立ち上げることが出来ないようにして VB.NETのフォームを作ってエクセルにデータを送ろうかと思いました。 それで、データを送る方法は何とかなりそうなのですが、 VB.NETのフォームからエクセルを起動して、 次にエクセルからそのフォームを出したり、隠したりしたいのですが、 その場合、VB.NETのフォームのなんと言うハンドルを取得すればよいでしょうか? IDにも色々あるようで、どれを使えばよいのか分からなくなってしまいました。 そのIDはVBのフォームを起動した時に、エクセルと共有するiniファイルなどに、書き込んでおこうかと思っています。 よろしくお願いいたします。m(__)m

  • VBでExcelが起動されているか知りたい

    環境 winXP Office2000 Excel VB6.0 sp5 VBからExcelが起動されているか知りたいのです。 【状況1】 [a.xls]を起動している状態で下記を実行すると問題なく起動が確認できます。 【状況2】 [a.xls][b.xls]を起動してて[b.xls]が前面にある場合は下記を実行しても[a.xls]を探せません。 またウインドウを最大化にしていない場合も"Microsoft Excel -"という文言がいらない?せいか探せません。 [FindWindowEx]を使用すればできるのかと思いましたがイマイチ使い方が分からず困っています。 よろしくお願いします。 'sampleソース--------------------------------------------- hwnd = FindWindow("XLMAIN", "Microsoft Excel - a.xls") If hwnd = 0 Then Msgbox(" 0 は、Excel が起動していないことを示します。") Else Msgbox(" 起動中") End If 'sampleソース---------------------------------------------

  • VB.NETでCreateProcess

    VB.NET(2003)で、別exeを起動し、終了まで待機するということをするために、 system.Diagnostics.Processクラスを使用していました。 しかし、実際に動かす環境がMetaFrameなのですが、 その環境では、このクラスは使用できないようで画面の起動すらできなくなります。 ですので、別の方法ということで、APIのCreateProcess、WaitForSingleObjectを使用するように変更したいのですが、 VB.NETでのサンプルが余り無いため、パラメータにどのように設定するかなどがよくわかりません。 API自体使ったことが無いので、根本的にわから無すぎるのです・・・ VB.NETでAPI利用サンプルが多く掲載されているサイト、 できれば、CreateProcess、WaitForSingleObjectを使用しているサンプルなどありましたら、ご教授願います。 よろしくお願いいたします。

  • 【C#】FindWindowExの使い方を教えてください

    はじめまして Visual Studio 2005を使用しています。 C#.NETは、いじり初めて1週間の超初心者です。 C#.NETでのFindWindowExの使い方を教えてください。 まずはじめに、vb.netで作ったアプリAの"Form1"があり、その中にテキストボックス"TextBox1"があります。 "TextBox1"のテキスト(キャプション?)には同じく"TextBox1"と入力されています。 そこで、C#側のアプリBでVBのアプリAの"Form1"のハンドルをFindWindowで取得します。 ここまでは出来ました。 次に、FindWindowExを使って"TextBox1"のハンドルを取得したいのですが、どうしてもうまく取得できません(0が返ってきます) 以下、C#のソースです。 (textBox1のMultilineはTrueです) ================================================================== using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication1 { public partial class Form1 : Form { [DllImport("user32.dll")] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] static extern IntPtr FindWindowEx(IntPtr hWnd, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); public IntPtr hWnd = (IntPtr)0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { IntPtr hWnd; IntPtr hWndTest; string sClassName = null; string sWindowText = "AppA"; // アプリAのウインドウハンドルを取得 hWnd = FindWindow(sClassName, sWindowText); textBox1.Text = "ウインドウのハンドル " + hWnd + "\r\n"; // アプリAのウインドウ内のTextBox1のハンドルを取得 hWndTest = hWnd; sClassName = null; sWindowText = "TextBox1"; hWnd = FindWindowEx(hWndTest, IntPtr.Zero, sClassName, sWindowText); textBox1.Text += "テキストボックスのハンドル " + hWnd; } } } ================================================================== Spy++で覗くとテキストボックスにもハンドルが割り与えられているので取得できるはずだと思っているのですが、どうしてもいまくいきません。 どうか、よろしくご享受願います。 ちなみに、アプリAのテキストボックスのクラス名が”WindowsForms10.EDIT.app.0.378734a”となっているのですが、これはどの環境でビルド(コンパイル)しても不変なのでしょうか? 不変だとしたら、クラス名を使えば悩まずに取得できると思うのですが・・・(実験済み)

  • VBで他アプリの「syslistview32」のテキストを取得したい

    VB6で他アプリの「syslistview32」のテキストを取得したいのです。 取得するためにはAPIを使用すると思うのですが、 使用するAPIが分かりません。 記述方法など分かる方、簡単でいいので教えて頂けるとありがたいです。 また、解説しているHP等がありましたら紹介頂けるとありがたいです。 よろしくお願いします。

  • VB6から他のプログラムを強制終了したい

    こんにちは、ただいま、VB6からあるプログラムを強制終了したいのプログラムを作りだいです。 強制終了したいのプログラムがVBのプログラムから起動じゃなくで、VBのプログラム実行する前に起動したのプログラムです。 API関数 TerminateProcess(hProcessHandle, 0&) を使いたいですが、現存のプロセスのProcessHandleを取得できません。 困ってる。 お手数ですが、解決方法が有れば教えてください

  • VB.NETで、Windows Vistaのスタートボタンを消すプログ

    VB.NETで、Windows Vistaのスタートボタンを消すプログラムをしています。 下記コードでタスクバーを消せるのですが、 hwnd = FindWindow("Shell_traywnd", vbNullString) value = SetWindowPos(hwnd, -1, 0, 0, 0, 0, &H80) value = FindWindowEx(hwnd, 0, "Button", vbNullString) EnableWindow(value, 0) で、スタートボタンを消せません。 何が悪いのかご教示いただけますでしょうか。 どうぞよろしくお願いいたします。

  • 起動したIEのウインドウタイトルを取得する方法

    こんばんは。WindowsXP+VB.NET環境です。 IE = CreateObject("InternetExplorer.Application") IE.Navigate("http://www.yahoo.co.jp") でインターネットエクスプローラを起動した場合に IEのウインドウの上の部分に表示されている 「Yahoo! JAPAN - Microsoft Internet Explorer」という文字と プロセスIDとプロセス名を取得したいのですが どのようなコードを書けば良いでしょうか? WEBサイトで調べていたら起動中の全プロセスのものを全て表示する 方法はあったのですが、起動したIE限定で取得したいです。 IE.IdとかIE.ProcessName、IE.MainWindowTitleのようにしてみたのですが エラーになってしまいました。 あと、別の方法で Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start("iexplore") hProcess.WaitForInputIdle() Dim pName As String = hProcess.MainWindowTitle としたら出来るようになったのですが、 起動した後に上の方法でやった時のようにIE.Navigate("http://****")で 移動したりしたいのですが、この方法で起動した場合の 方法が分からなくなってしまいました。 IE = CreateObject("InternetExplorer.Application")で起動したIEのように 操作できるようにする方法を教えて頂きたいです。よろしくお願い致します。

  • Java→VB2003アプリ→Batch でbatchファイルが起動できない

    どこで質問すべきか迷ったのですが。。。 質問タイトルどおりなのですが、 JavaアプリからRuntime#exec(); で起動して、Process#waitFor(); で終了待ちをしているアプリ(VB2003アプリ)から、 Shellでbatchファイルを起動しようとすると、起動できないという現象が起こっています。(exeは動きます) JAVAからではなく、単純にVB2003アプリだけを起動するとBatchファイルは正しく起動できます。 このbatchファイルの中から、さらにexeを起動しようとしているのがまずいのでしょうか? プロセスのネストの制限か何かにひっかかっているせいでしょうか? 調べてみたのですが、特に制限らしきものが見当たらなかったのですが、 ご存知でしたら、ご教示ください。

    • ベストアンサー
    • Java

専門家に質問してみよう