2017-11-29 14 views
-1

私はeventwathcerを使用しようとしていますが、11文字のプロセス名(AbcdEfghIII.exe)で動作しません。もし私が10文字のプロセス名(AbcdEfgIII.exe)を書いていればその作業。文字数制限がありますか、何か間違っていますか?ここに私のコードは次のとおりです。プロセス名がCustomizationで始まるかどうかの確認:正常にこの作品を作るための方法があるように思えませんのでManagementEventWatcherの文字数制限はありますか?

Imports System.Management 

    Public Class Form1 
Dim WithEvents StopWatch As New ManagementEventWatcher(New WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace")) 

Private Sub StopWatch_EventArrived(ByVal sender As Object, ByVal e As System.Management.EventArrivedEventArgs) 
    If e.NewEvent.Properties("ProcessName").Value.ToString = "AbcdEfghIII.exe" Then 
     MsgBox("Closed") 
    End If 
End Sub 

Private Sub Form1_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing 
    StopWatch.Stop() 
    RemoveHandler StopWatch.EventArrived, AddressOf StopWatch_EventArrived 
End Sub 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Try 
     AddHandler StopWatch.EventArrived, AddressOf StopWatch_EventArrived 
     StopWatch.Start() 
    Catch g As Exception 
     MsgBox("Please, run as admin.", MsgBoxStyle.Critical, "Error") 
     Me.Close() 
    End Try 
End Sub 
End Class 
+0

「動作していません」_を定義してください。何かエラーを投げますか?また、e.NewEvent.Properties( "ProcessName")。Value.ToString() 'を変数に入れ、[** breakpoint **](https://msdn.microsoft.com/en-us/)を配置します。ライブラリ/ 5557y8b4.aspx)を次の行に追加します。ブレークポイントがヒットしたら、マウスで変数にカーソルを置いて値を調べます。そうすれば、プロセスの名前が実際にあなたが期待するものであるかどうかを知ることができます。 –

+0

解決済み変数を使って、ありがとうございました。 –

+0

@VisualVincent解決済みだと思っていましたが、もう一度動作しないと思っていました... Dim Check = e.NewEvent.Properties( "ProcessName")。Value.ToString Dim check1 = "AbcdEfghIII.exe" check = check1ならば MsgBox ( "閉じた") End If'そして私はホバリングのことを理解していませんでした。 –

答えて

0

、私はあなただけハック回避策を使用する必要がありますと仮定します。

もちろん、それはCustomizationWHATEVER.exeのようなプロセスに反応しますが、何らかの理由で使用しているコードが完全な名前を返さないため、動作させる方法はありません。

If check.StartsWith("Customization", StringComparison.OrdinalIgnoreCase) Then 
    MessageBox.Show("Closed") 
End If 

前の回答:あなたの最初のコードの使用

ここ

は、回避策です:

代わりProcessNameProcessIDフィールドを取得し、それを使用しますProcess.GetProcessById()と一緒に.NEを取得するTフレンドリーProcess classインスタンス(そこから名前を抽出することができます)。

Private Sub StopWatch_EventArrived(ByVal sender As Object, ByVal e As System.Management.EventArrivedEventArgs) 
    Dim PID As Integer = CType(CType(e.NewEvent.Properties("ProcessID").Value, UInteger) And Integer.MaxValue, Integer) 
    Dim p As Process = Process.GetProcessById(PID) 

    'NOTE: The ".exe" part is excluded in Process.ProcessName. 
    If String.Equals(p.ProcessName, "Customization", StringComparison.OrdinalIgnoreCase) Then 
     MessageBox.Show("Closed") 
    End If 
End Sub 
+0

もう一度何も起こらなかった:/また、私は以前のように短い名前で試した( "Customiza")それも動作しませんでした。男、何が変わったのか... –

+0

@ErokayYurdaer:文字制限がないと言ったように、文字列を短くすることは間違いないでしょう。あなたが 'If'の外のメッセージボックスにそれを表示するとどうなりますか:' MessageBox.Show(p.ProcessName) '? (私は 'Customization'を表示している場合にのみ興味があります) –

+0

いいえmsgboxが表示されます –

関連する問題