コメント |
http://lightbox.on.coocan.jp/download/wsh/PROCESS_CHECK_NEXT.vbs
[[VBSCript(同期メソッド)の場合]]
@DIV
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set objMonitor = objWMIService. _
http://msdn.microsoft.com/en-us/library/aa393864.aspx|(ExecNotificationQuery)("select * from __instancecreationevent " _
& " within 1 where TargetInstance isa 'Win32_Process'")
Do
@C:green(' 次に新しいプロセスが開始されるまで、待ちます)
Set objProcess = objMonitor.NextEvent
@C:green(' 終了する手段として winver.exe を実行します)
if Ucase( objProcess.TargetInstance.Name ) = "WINVER.EXE" then
Wscript.Echo "プロセスの監視を終了します"
Exit Do
end if
Wscript.Echo objProcess.TargetInstance.Name
Wscript.Echo objProcess.TargetInstance.ExecutablePath
Loop
@END
http://msdn.microsoft.com/en-us/library/aa394606.aspx(WQL:SQL for WMI)
[[VBSCript(非同期メソッド)の場合]]
@DIV
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set http://msdn.microsoft.com/en-us/library/aa393877.aspx(objSink) = WScript.CreateObject( _
"WbemScripting.SWbemSink","SINK_")
objWMIservice.http://msdn.microsoft.com/en-us/library/aa393865.aspx(ExecNotificationQueryAsync) objSink, _
"SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE " _
& "TargetInstance ISA 'Win32_Process'"
' イベントを待つ為にプログラムを終わらさないようにする
MsgBox("待機しています...")
Sub SINK_http://msdn.microsoft.com/en-us/library/aa393881.aspx|(OnObjectReady)(objObject, objAsyncContext)
' 名前
WScript.Echo objObject.TargetInstance.Name
' 実行パス
WScript.Echo objObject.TargetInstance.ExecutablePath
' プロパティの列挙
For Each obj IN objObject.http://msdn.microsoft.com/en-us/library/aa393781.aspx(Properties_)
strProp = obj.Name & vbCrLf
Set objTarget = obj.Value
For Each obj2 IN objTarget.Properties_
strProp = strProp & vbTab & obj2.Name & vbCrLf
Next
Next
WScript.Echo strProp
End Sub
@END
[[VB.NET(同期メソッド)の場合]]
@DIV
Imports System.Threading
Imports System.Management
Public Class Form1
@C:green(' スレッドの終了をコントロールするフラグ)
Private stopFlg As Integer = 0
@C:green(' **************************************************
' 初期処理
' **************************************************)
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.LboxGrid1.UseParentFitForm = Me
Me.LboxGrid1.AddColumn("TIME", "時刻")
Me.LboxGrid1.AddColumn("NAME", "名称")
Me.LboxGrid1.AddColumn("PATH", "ファイル")
@C:green(' スレッド処理するメソッドを作成)
Dim ThreadProc As New Thread(AddressOf ThreadEntry)
@C:green(' スレッド開始)
ThreadProc.Start()
End Sub
@C:green(' **************************************************
' スレッドの入り口
' **************************************************)
Private Sub ThreadEntry()
Dim Bridge As New ProcBridge(AddressOf SetData)
Dim Query As New EventQuery( _
"SELECT * FROM" & _
" __InstanceCreationEvent WITHIN 1 " & _
"WHERE TargetInstance isa ""Win32_Process""")
' 監視用オブジェクト
Dim Monitor As New http://msdn.microsoft.com/ja-jp/library/s4acy5e2.aspx|(ManagementEventWatcher)(Query)
@C:green(' 時分秒[ WaitForNextEvent 内での監視時間 ])
Monitor.Options.http://msdn.microsoft.com/ja-jp/library/system.management.managementoptions.timeout.aspx(Timeout) = New http://msdn.microsoft.com/ja-jp/library/bk8a3558.aspx|(TimeSpan)(0, 0, 1)
Dim targetProcess As ManagementBaseObject = Nothing
@C:green(' 参照する為に、常に 0 で比較後等しければ 0 をセット。1 の時にループ終了)
Do While Interlocked.CompareExchange(stopFlg, 0, 0) = 0
Try
@C:green(' タイムアウトでは、エラーで Try を抜ける)
targetProcess = Monitor.WaitForNextEvent()
Dim str1 = _
CType(targetProcess("TargetInstance"), _
ManagementBaseObject)("Name")
Dim str2 = _
CType(targetProcess("TargetInstance"), _
ManagementBaseObject)("ExecutablePath")
Me.Invoke(Bridge, New Object() {1, str1, str2})
Catch ex As Exception
End Try
Loop
Monitor.Stop()
Monitor.Dispose()
@C:green(' 実際の終了を通知する)
Me.Invoke(Bridge, New Object() {-1, "終了処理中です...", ""})
End Sub
@C:green(' **************************************************
' 橋渡し用デリゲート
' **************************************************)
Delegate Sub ProcBridge(ByVal type As Integer, _
ByVal str1 As String, ByVal str2 As String)
@C:green(' **************************************************
' 橋渡し用実体
' **************************************************)
Private Sub SetData(ByVal type As Integer, _
ByVal Name As String, ByVal Path As String)
If type = 1 Then
Me.LboxGrid1.AddRow()
Me.LboxGrid1.SetColumnText("TIME", Now.ToString())
Me.LboxGrid1.SetColumnText("NAME", Name)
Me.LboxGrid1.SetColumnText("PATH", Path)
End If
If type = -1 Then
Me.LboxGrid1.AddRow()
Me.LboxGrid1.SetColumnText("TIME", Now.ToString())
Me.LboxGrid1.SetColumnText("NAME", Name)
Me.LboxGrid1.Update()
Thread.Sleep(1000)
@C:green(' 終了通知うけて、実際終了する)
@C:green(' [ FormClosing と FormClosed が発生する ])
Application.Exit()
End If
End Sub
@C:green(' **************************************************
' フォームが閉じる前[ e.Cancel = True でキャンセル可能 ]
' **************************************************)
Private Sub Form1_FormClosing(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles MyBase.FormClosing
@C:green(' スレッド実行中ならば、スレッドが終了する状態にして、終了処理をキャンセル)
If Interlocked.CompareExchange(stopFlg, 0, 0) = 0 Then
Interlocked.Exchange(stopFlg, 1)
e.Cancel = True
End If
End Sub
End Class
@END
http://msdn.microsoft.com/en-us/library/aa394649.aspx(TargetInstance を持つ __InstanceCreationEvent)
http://msdn.microsoft.com/en-us/library/aa394372.aspx(Name と ExecutablePath を持つ Win32_Process)
[[VB.NET(非同期メソッド)の場合]]
@DIV
Imports System.Threading
Imports System.Management
Public Class 非同期
@C:green( ' 監視用オブジェクト)
Private Monitor As ManagementEventWatcher = Nothing
@C:green(' **************************************************
' 初期処理
' **************************************************)
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.LboxGrid1.UseParentFitForm = Me
Me.LboxGrid1.AddColumn("TIME", "時刻")
Me.LboxGrid1.AddColumn("NAME", "名称")
Me.LboxGrid1.AddColumn("PATH", "ファイル")
Dim Query As New EventQuery( _
"SELECT * FROM" & _
" __InstanceCreationEvent WITHIN 1 " & _
"WHERE TargetInstance isa ""Win32_Process""")
@C:green(' 監視用オブジェクト作成)
Monitor = New ManagementEventWatcher(Query)
@C:green(' イベントハンドラ登録)
AddHandler Monitor.EventArrived, AddressOf Monitor_EventArrived
@C:green(' 監視開始)
Monitor.Start()
End Sub
@C:green(' **************************************************
' イベント
' **************************************************)
Public Sub Monitor_EventArrived(ByVal sender As Object, _
ByVal e As EventArrivedEventArgs)
Dim Bridge As New ProcBridge(AddressOf SetData)
Dim targetProcess As ManagementBaseObject = e.NewEvent
Dim str1 = _
CType(targetProcess("TargetInstance"), _
ManagementBaseObject)("Name")
Dim str2 = _
CType(targetProcess("TargetInstance"), _
ManagementBaseObject)("ExecutablePath")
Me.Invoke(Bridge, New Object() {1, str1, str2})
End Sub
@C:green(' ************************************************************
' 橋渡し用デリゲート
' ************************************************************)
Delegate Sub ProcBridge(ByVal type As Integer, _
ByVal str1 As String, ByVal str2 As String)
@C:green(' ************************************************************
' 橋渡し用実体
' ************************************************************)
Private Sub SetData(ByVal type As Integer, _
ByVal Name As String, ByVal Path As String)
If type = 1 Then
Me.LboxGrid1.AddRow()
Me.LboxGrid1.SetColumnText("TIME", Now.ToString())
Me.LboxGrid1.SetColumnText("NAME", Name)
Me.LboxGrid1.SetColumnText("PATH", Path)
End If
End Sub
@C:green(' **************************************************
' フォームが閉じる前[ e.Cancel = True でキャンセル可能 ]
' **************************************************)
Private Sub Form1_FormClosing(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles MyBase.FormClosing
@C:green(' 監視終了)
Monitor.Stop()
Monitor.Dispose()
End Sub
End Class
@END
|