【问题标题】:Determine Process ID with VBA使用 VBA 确定进程 ID
【发布时间】:2017-05-19 16:53:32
【问题描述】:

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

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

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

【问题讨论】:

  • Firefox 窗口是从您的代码中打开的吗?
  • 目前没有,但可能会。没有什么能阻止我从代码中打开每个窗口。

标签: excel vba


【解决方案1】:

您可以使用以下内容。您必须修改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 as Object。然后,您可以添加断点并查看 Locals 窗格中发生的情况。

添加引用后:

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”找到的每个进程的每个属性。

【讨论】:

  • 谢谢。您提供的代码与您所说的完全一样。我想我误解了我读过的其他帖子。我的印象是每个窗口都会有一个唯一的 PID 替代父 PID。但是,无论我打开 1、2 还是 10 个窗口,我都只会得到一个 PID。
  • 我认为这取决于程序,但假设窗口和进程是 1:1 绝对不是一个安全的赌注。我假设使用 Firefox 可能取决于您如何启动每个窗口。与 excel 一样,您可以在同一个“应用程序”中拥有多个工作簿,也可以在多个“应用程序”中拥有多个工作簿。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-15
  • 1970-01-01
  • 2017-03-30
  • 2020-01-16
  • 2021-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多