excel - 使用 VBA 确定进程 ID

标签 excel vba

情况 - 我有一个宏,需要将击键按顺序发送到两个 Firefox 窗口。不幸的是,两个窗口具有相同的标题。为了处理这个问题,我激活了该窗口,发送了我的击键,然后使用 F6 加载第二个窗口的 URL,然后发送击键,然后使用 F6 将其返回到原始页面。

问题是加载网页不可靠。页面加载速度差异很大,以至于使用等待命令无法一致或可靠地确保击键进入第二个窗口。

问题 - 我读过一些帖子,其中提到应用程序激活将与进程 ID 一起使用。由于每个窗口都有自己的 PID,因此这是处理两个具有相同标题的窗口的理想方法。我无法找到具体如何确定具有给定名称的每个窗口的 PID 的信息。

最佳答案

您可以使用如下所示的内容。您必须修改 Win32_Process 中提供的不同信息。类来确定哪个窗口是哪个。同样重要的是要记住,一个窗口可能意味着多个进程。

Public Sub getPID()        
    Dim objServices As Object, objProcessSet As Object, Process As Object

    Set objServices = GetObject("winmgmts:\\.\root\CIMV2")
    Set objProcessSet = objServices.ExecQuery("SELECT ProcessID, name FROM Win32_Process WHERE name = ""firefox.exe""", , 48)

    'you may find more than one processid depending on your search/program
    For Each Process In objProcessSet
       Debug.Print Process.ProcessID, Process.Name
    Next

    Set objProcessSet = Nothing       

End Sub

由于您可能想稍微探索一下 WMI 的选项,因此您可能需要添加“工具>>对 Microsoft WMI 库的引用”,这样您就不必将 Dim bla 作为对象处理。然后您可以添加断点并查看“局部变量” Pane 中发生的情况。

添加引用后:

Public Sub getDetailsByAppName()

    Dim objProcessSet As WbemScripting.SWbemObjectSet
    Dim objProcess As WbemScripting.SWbemObject
    Dim objServices As WbemScripting.SWbemServices
    Dim objLocator As WbemScripting.SWbemLocator

    'set up wmi for local computer querying
    Set objLocator = New WbemScripting.SWbemLocator
    Set objServices = objLocator.ConnectServer(".") 'local

    'Get all the gory details for a name of a running application
    Set objProcessSet = objServices.ExecQuery("SELECT * FROM Win32_Process WHERE name = ""firefox.exe""", , 48)

    RecordCount = 1
    'Loop through each process returned
    For Each objProcess In objProcessSet
        'Loop through each property/field
        For Each Field In objProcess.Properties_
            Debug.Print RecordCount, Field.Name, Field.Value
        Next
        RecordCount = RecordCount + 1
    Next

    Set objProcessSet = Nothing
    Set objServices = Nothing
    Set objLocator = Nothing


End Sub

这将打印出为名称“firefox.exe”找到的每个进程的每个属性。

关于excel - 使用 VBA 确定进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44075292/

相关文章:

vba - Excel VBA : Paste problems

excel - 打开 ZipFile,查找特定文件类型并保存文件名

internet-explorer - 创建后访问 IE 选项卡

c# - 如何更改 MS Excel 单元格中文本的颜色?

vba - 类型与工作表名称 VBA 不匹配

vba - 使用 VBA 插入分页符

excel - 如何在 vba 代码中执行 "Save As",用日期戳保存当前的 Excel 工作簿?

excel - 如何在VBA中获取带有单引号的Excel单元格值(如果在文本开头)

javascript - 如何将响应转为 Excel 文件

vba - Excel vba : choosing random cell from non-contiguous range