関連付けて開いたアプリのプロセスID取得方法


とらサン  2007-04-16 01:55:21  No: 136070

(XP+VB6)お世話になります。  他のアプリを関連付けファイルから起動させて立ち上がりが完了するまで待つようにしたいと計画しています。

じゃんぬ様のサイトで WaitForInputIdleProcess  により指定したアプリで起動した場合のやりかたを拝見させていただきました(http://jeanne.wankuma.com/tips/process/waitforinputidle.html)が、これを関連付けして開いたアプリで適用したいと思います。それには「プロセスID」を取得する必要があるようですがその方法がわかりませんので教えてください


魔界の仮面弁士  2007-04-16 18:13:42  No: 136071

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


魔界の仮面弁士  2007-04-16 19:00:22  No: 136072

失礼しました…終了待機ではなく、起動待機でしたね。


もげ  2007-04-16 19:23:20  No: 136073

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
を適用  というアプローチもアリかと思います。


魔界の仮面弁士  2007-04-16 20:23:30  No: 136074

関連付け起動させるのではなく、関連付け対象のアプリケーションを取得して、
その exe を起動するようにすれば、じゃんぬ氏のサンプルがそのまま使えるかも。

exe パスの取得は、FindExecutable だと KB140724 の問題があるので……、
使うとすれば、AssocQueryString ですね。(もしくは、レジストリを直接参照)

あと、じゃんぬ氏のコードだと、Shell → OpenProcess までの間にアプリが
終了され、さらにその時、たまたま「別のアプリ」が、同一のプロセス ID で
起動されてしまい、別のアプリを監視することになるという レアなケースが
発生する事がある かも 知れないので、別案として、OpenProcess の代わりに、
CreateProcess (および CloseHandle) の利用を検討すべきかも知れません。

# 未検証で書いてます。m(_ _)m

> 「プロセスID」を取得する必要があるようですが
それ以外の手法だと、Win32_Process.Create メソッドによる起動で、
引数から ProcessId を得るようにするとか。

Create メソッドによる起動だと都合が悪い場合は、起動後に、
Win32_Process.ProcessId プロパティを取得するとか。


スクリプトプログラマ  2007-04-17 12:18:02  No: 136075

関連付けでは、プロセスが起きて、その終了が待てるとは限らないので
そのやり方はやめたほうがよいと思いますけど。。。
どの関連付けか限定できるなら、やりようもあるかも知れませんが。。。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加