(XP+VB6)お世話になります。 他のアプリを関連付けファイルから起動させて立ち上がりが完了するまで待つようにしたいと計画しています。
じゃんぬ様のサイトで WaitForInputIdleProcess により指定したアプリで起動した場合のやりかたを拝見させていただきました(http://jeanne.wankuma.com/tips/process/waitforinputidle.html)が、これを関連付けして開いたアプリで適用したいと思います。それには「プロセスID」を取得する必要があるようですがその方法がわかりませんので教えてください。
Dim file As String
file = "C:\sample.bmp"
MsgBox file & "を開きます。", vbInformation Or vbSystemModal
CreateObject("WScript.Shell").Run file, vbNormalFocus, True
MsgBox file & "が閉じられました。", vbInformation Or vbSystemModal
失礼しました…終了待機ではなく、起動待機でしたね。
APIを使用しているのであれば、
ShellExecuteではなくて、ShellExecuteEx を使用。
WScript.Shellなどであれば、
http://www.microsoft.com/japan/technet/scriptcenter/resources/scriptshop/shop0505.mspx
もしくは、
http://dobon.net/vb/dotnet/system/findassociatedexe.html
でプログラムの実態を求めて、
http://jeanne.wankuma.com/tips/process/waitforinputidle.html
を適用 というアプローチもアリかと思います。
関連付け起動させるのではなく、関連付け対象のアプリケーションを取得して、
その exe を起動するようにすれば、じゃんぬ氏のサンプルがそのまま使えるかも。
exe パスの取得は、FindExecutable だと KB140724 の問題があるので……、
使うとすれば、AssocQueryString ですね。(もしくは、レジストリを直接参照)
あと、じゃんぬ氏のコードだと、Shell → OpenProcess までの間にアプリが
終了され、さらにその時、たまたま「別のアプリ」が、同一のプロセス ID で
起動されてしまい、別のアプリを監視することになるという レアなケースが
発生する事がある かも 知れないので、別案として、OpenProcess の代わりに、
CreateProcess (および CloseHandle) の利用を検討すべきかも知れません。
# 未検証で書いてます。m(_ _)m
> 「プロセスID」を取得する必要があるようですが
それ以外の手法だと、Win32_Process.Create メソッドによる起動で、
引数から ProcessId を得るようにするとか。
Create メソッドによる起動だと都合が悪い場合は、起動後に、
Win32_Process.ProcessId プロパティを取得するとか。
関連付けでは、プロセスが起きて、その終了が待てるとは限らないので
そのやり方はやめたほうがよいと思いますけど。。。
どの関連付けか限定できるなら、やりようもあるかも知れませんが。。。
ツイート | ![]() |