全プロセスを列挙し、ファイル名からアプリを識別するのを繰り返して検知する方法です。
使いやすいよう、モジュールにしてみたので良ければどうぞ。
参考:
http://hsp.tv/play/pforum.php?mode=pastwch&num=55084
//
// 特定アプリの起動を検知するためのモジュール(Windows Vista以降で動作)
//
#module wait_for_app_startup
#uselib "psapi.dll"
#func EnumProcesses "EnumProcesses" sptr,sptr,sptr
#uselib "kernel32.dll"
#func OpenProcess "OpenProcess" sptr,sptr,sptr
#func CloseHandle "CloseHandle" sptr
#func QueryFullProcessImageName "QueryFullProcessImageNameA" sptr,sptr,sptr,sptr
#define PROCESS_ALL_ACCESS 0x1F0FFF
#deffunc local Init
dim pIds
pIdCount = 1024
dim returnSize
sdim filePath, 260 // MAX_PATH
return
// 指定アプリが起動するまで待機する
// p1 = 起動を待つアプリのファイル名
// 戻り値: 起動したアプリのプロセスID
#deffunc WaitForAppStartup str appFileName
ret = -1
dim pIdsOld
isFirstTime = 1
repeat
// 全プロセスのIDを取得
repeat
// 列挙
dim pIds, pIdCount
EnumProcesses varptr(pIds), varsize(pIds), varptr(returnSize)
// 返されたサイズが配列のサイズより小さくなるまで(列挙しきるまで)繰り返す
if (returnSize < varsize(pIds)) {
pIdCount = returnSize / 4
break
}
pIdCount ++
loop
if (isFirstTime == 0) {
repeat pIdCount
// 新しいプロセスか判定
isNewProcess = 1
pId = pIds(cnt)
repeat length(pIdsOld)
if (pId == pIdsOld(cnt)) {
isNewProcess = 0
}
loop
if (isNewProcess == 0) : continue
// プロセスの実行ファイルパス取得
filePath = ""
size = varsize(filePath) - 1
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pIds(cnt))
if (hProcess != 0) {
QueryFullProcessImageName hProcess, 0, varptr(filePath), varptr(size)
}
CloseHandle hProcess
// ファイル名で、アプリ識別
fileName = getpath(filePath,8)
if (fileName == appFileName) {
ret = pIds(cnt)
break
}
loop
if (ret != -1) : break
}else{
isFirstTime = 0
}
dim pIdsOld, pIdCount
memcpy pIdsOld, pIds, pIdCount * 4
// 1秒周期
wait 100
loop
return ret
#global
Init@wait_for_app_startup
/* -------------------- モジュール ここまで -------------------- */
// メモ帳の起動を検知するサンプル
mes "Windows標準の「メモ帳」を起動してみてください。"
repeat
WaitForAppStartup "notepad.exe"
mes "メモ帳が起動した (PID:" + stat + ")"
loop