必要になったので。
あるところで仕入れたら、Windows APIを使わんでもできるそうな。
ポイントはこれに限るかも。
- Word.Applicationでタスクリストを取得する
※Excelなどには実装されてないらしい…
んで、コード。
Public Function GetProcessNames(ByRef objProcesses As Collection)
' Wordアプリケーションオブジェクトを生成する
Dim objWord As Object
Set objWordProcess = CreateObject("Word.Application")
' タスクリストから表示中のものだけ取得する
Dim objTask As Object
For Each objTask In objWordProcess.Tasks
' continueが使えないのでDo-Loopで回避する
Do
' 非表示のプロセスはスキップする
If objTask.Visible = False Then
Exit Do
End If
' プロセス名を出力引数に追加する
objProcesses.Add objTask.Name
Loop While False
Next
' オブジェクトを破棄する
Set objWord = Nothing
End Function
あと、メソッドを呼ぶためのメソッドっぽいの(VBAでいうSubプロシージャ)はこんな感じ。
Public Sub DoFunction()
' ウィンドウタイトルのリストを生成する
Dim objProcesses As Collection
Set objProcesses = New Collection
' ウィンドウタイトルを取得する
Call GetProcessNames(strTitle, objProcesses)
' オブジェクトを破棄する
Set objProcesses = Nothing
' タイトルをイミディエイトウィンドウに表示する
Dim objName As Variant
objName = ""
For Each objName In objProcesses
Debug.Print objName
Next
End Sub
実行したら、こんな感じ。
スタート Microsoft Visual Basic - プロセス.xls [実行中] - [ThisWorkbook (コード)] Microsoft Visual Basic - Book2.xls - [Sheet1 (コード)] Microsoft Excel - Book2.xls Microsoft Excel - プロセス.xls Skype? - xxx@hotmail.com VBAメモ Windows APIを使わずに階層の深いフォルダーを作成してみる - Mozilla Firefox Program Manager
いつ、VBAの実装が変わるか分からんで、永久に使えるかは分かんないけどね…。
んまま、明日の自分へのメモってことで。