(特定のタスク(アプリケーション)が起動中かどうかを監視して、もし起動していなければ起動させたいのです)
※ただし、プロセス名では同じものが複数あり区別できないためタスクバーに表示される名称(タスク名)で調べる方法を教えて下さい。
http://www.windowsitpro.com/Articles/Print.cfm?ArticleID=15643
Login / Subscribe
タスクの管理にはWindows Management Interface(WMI)を使います。リンク先にまさに、特定のプロセスが起動中か見て再起動するというプログラムのサンプルがあります。
こちら入門編
プロセスのクラスWin32_Process
コードサンプルもありました:
strComputer = ”.”
Set objWMIService = GetObject(”winmgmts:” _
& ”{impersonationLevel=impersonate}!¥¥” _
& strComputer & ”¥root¥cimv2”)
Set colProcesses = objWMIService.ExecQuery( _
”select * from win32_process” )
For Each objProcess in colProcesses
If objProcess.GetOwner ( User, Domain ) = 0 Then
Wscript.Echo ”Process ” & _
objProcess.Caption & _
” belongs to ” & Domain & _
”¥” & User
Else
Wscript.Echo ”Problem ” & Rtn & _
” getting the owner for process ” _
& objProcess.Caption
End If
Next
う、でもいくら探しても『タスク名』のプロパティはありません!たとえばiexplore.exeは1つのプロセスですが、ウィンドウを沢山開いていれば複数の「タスク」になり、どのみちプロセスとタスクは1対1ではないです。WMIのほかのクラスを探しても「タスク」はなさそう。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/jap...
MSDN ライブラリ サイト移行に関する重要なお知らせ
タスクバーのタイトルを取得するにはWin32 APIのFindWindowを使用する必要がありますが、調べた限りではWSHから直接呼び出すことはできないようです。
と言うわけで、間に挟むためのActiveXコンポーネントを作成したりしないといけないようです。
ご回答ありがとうございます。
「タスク名」というのではなく、「ウィンドウ名」と呼ぶのが正しかったんですね。
でもWSHにActiveXを挟んだりするくらいなら、ご提示いただいたAPIを直接つつくVBのプログラムを作ろうかな...という気になってきましたが、時間がありませんのでここで質問を終了させていただき、とりあえず、次のようなスクリプトでしのぐことにします。
ご回答ありがとうございました!
Set objArgs = WScript.Arguments
Select Case objArgs.Count
Case 2
rem 稼動チェックしたいウィンドウ名称
strWindowName = objArgs.Item(0)
rem 稼動させたいプログラム名称
strProgramName = objArgs.Item(1)
Case Else
WScript.Echo ”引数が足りません”
WScript.Echo ”Usage: cscript //Nologo checkprocess.vbs WindowName ProgramName”
End Select
Set WshShell = CreateObject(”WScript.Shell”)
RetCode = WshShell.AppActivate( strWindowName )
If RetCode <> ”True” Then
Set WshShell = WScript.CreateObject(”WScript.Shell”)
r = WshShell.Run( Chr(34) & strProgramName & Chr(34), 1, true )
End If
ご回答ありがとうございます。
set WshShell = CreateObject(”WScript.Shell”)
WshShell.AppActivate ”はてな質問一覧”
みたいにすれば、タスクバーに表示されてる名前でアプリケーションを指定できますよね?
「iexplore.exe」が起動中かどうかではなく、「はてな質問一覧」が起動中か「Yahoo! JAPAN」が起動中か、までを特定したいんです。
※上記のやり方でアクティブにしてみて出来なければ起動していない、と判断するという手も考えられますが、正面から突破できないかなと思いまして。