vb.net - 如何在 vb.net 中获取 WINWORD 进程的所有实例
问题描述
我想获取 WINWORD 进程的所有实例。如图所示,我在 WINWORD 进程中运行了两个窗口。我想获取他们的文件名和路径。
这是我的代码
Dim processStartEvent As ManagementEventWatcher = New ManagementEventWatcher("SELECT * FROM Win32_ProcessStartTrace")
Dim processStopEvent As ManagementEventWatcher = New ManagementEventWatcher("SELECT * FROM Win32_ProcessStopTrace")
Public Sub New()
InitializeComponent()
AddHandler processStartEvent.EventArrived, AddressOf Me.processStartEvent_EventArrived
processStartEvent.Start()
AddHandler processStopEvent.EventArrived, AddressOf Me.processStopEvent_EventArrived
processStopEvent.Start()
End Sub
Private Sub processStartEvent_EventArrived(EventArrivedEventArgs, e)
Dim processName As String = e.NewEvent.Properties("ProcessName").Value.ToString
Dim processID As String = Convert.ToInt32(e.NewEvent.Properties("ProcessID").Value).ToString
FileIO.WriteToFile("+ Process started. Name: " & processName & " | ID: " + processID)
FileIO.WriteToFile(" | Date & Time: ")
FileIO.WriteToFile(System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") & vbNewLine & vbNewLine)
End Sub
Private Sub processStopEvent_EventArrived(EventArrivedEventArgs, e)
Dim processName As String = e.NewEvent.Properties("ProcessName").Value.ToString
Dim processID As String = Convert.ToInt32(e.NewEvent.Properties("ProcessID").Value).ToString
FileIO.WriteToFile("- Process stopped. Name: " & processName & " | ID: " + processID)
FileIO.WriteToFile(" | Date & Time: ")
FileIO.WriteToFile(System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") & vbNewLine & vbNewLine)
End Sub
我正在获取进程名称、ID 以及进程的日期和时间。我想获取进程的实例。
解决方案
我将此代码用于 Word 实例,但它对我没有任何作用。
公共类 MyNewService Dim tmr As Timers.Timer
Public Sub New()
InitializeComponent()
Try
Dim allProcesses = Process.GetProcesses().Where(Function(p) p.ProcessName.Contains("WINWORD.EXE"))
Dim windowTitles = ChildWindowManager.GetChildWindowTitles(allProcesses.First().Id)
For Each title In windowTitles
If (title.Contains("- Word")) Then
FileIO.WriteToFile(title)
End If
Next
Catch ex As Exception
End Try
End Sub
Class ChildWindowManager
Delegate Function EnumThreadDelegate(ByVal hWnd As IntPtr, ByVal lParam As IntPtr) As Boolean
<DllImport("user32.dll")>
Private Shared Function EnumThreadWindows(ByVal dwThreadId As Integer, ByVal lpfn As EnumThreadDelegate, ByVal lParam As IntPtr) As Boolean
End Function
<DllImport("user32.dll")>
Public Shared Function GetWindowText(ByVal hwnd As Integer, ByVal lpString As System.Text.StringBuilder, ByVal cch As Integer) As Integer
End Function
<DllImport("user32.dll")>
Private Shared Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
End Function
Private Shared Function EnumerateProcessWindowHandles(ByVal processId As Integer) As List(Of IntPtr)
Dim windowHandles = New List(Of IntPtr)()
For Each thread As ProcessThread In Process.GetProcessById(processId).Threads
EnumThreadWindows(thread.Id, Function(hWnd, lParam)
windowHandles.Add(hWnd)
Return True
End Function, IntPtr.Zero)
Next
Return windowHandles
End Function
Private Shared Function GetWindowTitle(ByVal hWnd As IntPtr) As String
Dim length As Integer = GetWindowTextLength(hWnd)
If length = 0 Then Return Nothing
Dim titleStringBuilder As New Text.StringBuilder("", length)
GetWindowText(hWnd, titleStringBuilder, titleStringBuilder.Capacity + 1)
Return titleStringBuilder.ToString()
End Function
Public Shared Function GetChildWindowTitles(processId As Integer) As List(Of String)
Dim windowTitles As New List(Of String)
For Each handlee In EnumerateProcessWindowHandles(processId)
Dim windowText = GetWindowTitle(handlee)
If windowText <> Nothing Then
windowTitles.Add(windowText)
End If
Next
Return windowTitles
End Function
End Class
Protected Overrides Sub OnStart(ByVal args() As String)
System.Diagnostics.Debugger.Launch()
tmr = New Timers.Timer()
tmr.Enabled = True
FileIO.WriteToFile("Service is Started!" + vbNewLine)
FileIO.WriteToFile(System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") & vbNewLine & vbNewLine & vbNewLine)
System.Diagnostics.Debugger.Launch()
End Sub
Protected Overrides Sub OnStop()
tmr.Enabled = False
FileIO.WriteToFile(vbNewLine)
FileIO.WriteToFile("Service is Stopped!" + vbNewLine)
FileIO.WriteToFile(System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") & vbNewLine & vbNewLine)
End Sub
结束类
推荐阅读
- ios - 更新 pod 后面临额外参数错误
- python - windows上的python vlc控件
- ios - 找出 UIView 进入(滚动到)屏幕的那一刻
- android - androidx.appcompat.widget.SearchView 没有出现在工具栏中
- python - 计算 keras 模型中不可训练的参数 params
- c# - MongoDb - 获取执行查询的日志
- javascript - 退出搜索框事件时如何重置占位符?
- python - 当基本 django 用户模型被覆盖时,如何正确处理当前登录的用户作为作者?
- c# - 使用 Azure DevOps Build 从我的代码中看不到代码覆盖率
- python - 在 Docker 容器中运行`flake8 src`时没有输出