1

私のアプリケーションでは、ユーザーがファイルを開くダイアログからプログラムを追加できるようにし、アイテムをリストビューに追加して、アイテムの場所をタグに保存します。だから私がやろうとしているのは、リストビュー内のプログラムが選択されてボタンが押されたときにタイマーを開始し、このタイマーがプロセスが実行されているかどうかを確認し、プロセスが実行されていない場合はプロセスを起動し、一度プロセスが起動され、プロセスのウィンドウ タイトルが取得され、別のフォームのテキスト ボックスに送信されます。

編集:問題は、なぜそれが機能していないのか、誰かがそれを理解できるかどうかです。つまり、プロセスを開始してから、フォームを閉じてプロセスウィンドウのタイトルを別のフォームのテキストボックスに追加し始めたときです。私はそれを機能させようとしましたが、できません。取得しているプロセス名が正しいことはわかっています。私の問題は、for ループに関係していると思います。基本的に、現在目に見えることは何もしていません。

私は自分のコードに非常に近いと感じており、わずかな調整が必要なだけだと思っています。どんな助けでも大歓迎です。私のコーディング慣行がそれほど優れていない場合は申し訳ありませんが、これはかなり新しいものです。

**編集:解決策が見つかりました。タイマーがプロセスを実行できるようにするコードをボタンに追加しました。また、別の問題は実際にファイルを読み取る方法でした.replace関数を使用して、ファイルパスコードから「.exe」を削除する必要がありました.

編集 2:より良い解決策が Mark Hall によって投稿されました。エラーの可能性が少ないため、彼のコードを使用しています。

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
       Dim s As String = ListView1.SelectedItems(0).Tag
    Dim myFile As String = Path.GetFileName(s)
    Dim mu As String = myFile.Replace(".exe", "").Trim()
    Dim f As Process
    Dim p As Process() = Process.GetProcessesByName(mu)

    For Each f In p
        If p.Length > 0 Then
            For i As Integer = 0 To p.Length - 1
                ProcessID = (p(i).Id)
                AutoMain.Name.Text = f.MainWindowTitle
                Timer1.Enabled = False
                Me.Close()
            Next
        Else
            ProcessID = 0
            End If
        If ProcessID = 0 Then
            Process.Start(mu)
        End If
    Next
    End Sub
4

1 に答える 1

0

何が起こっているかというと、For Each ループに入る前にパラメーターに一致する Process を探しているということです。

これは動作する非常に簡単な例です:

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    Dim s As String = ListView1.SelectedItems(0).Tag.ToString
    Dim myFile As String = Path.GetFileName(s)

    Dim p As Process() = Process.GetProcessesByName(Path.ChangeExtension(myFile, Nothing))
    Static started As Boolean

    If p.Count > 0 Or started Then
        If p.Length > 0 Then
            For i As Integer = 0 To p.Length - 1
                ProcessId = (p(0).Id)
                AutoMain.Name.Text = p(0).MainWindowTitle
                Timer1.Enabled = False
                started = False
                Timer1.Stop()
                Me.Close()
            Next
        Else
            ProcessId = 0
        End If
    Else
        started = True
        Process.Start(myFile)
    End If

End Sub
于 2012-09-15T03:43:35.210 に答える